Tôi có một câu hỏi: Làm thế nào để biên dịch một thư viện tĩnh trong linux với gcc, tức là tôi cần phải biên dịch mã nguồn của tôi thành một tệp có tên out.a. Có đủ để đơn giản biên dịch với lệnh gcc -o out.a out.c
không? Tôi không khá quen thuộc với gcc, hy vọng mọi người có thể cho tôi một tay.Làm thế nào để biên dịch một thư viện tĩnh trong linux?
99
A
Trả lời
154
Xem Creating a shared and static library with the gnu compiler [gcc]
gcc -c -o out.o out.c
-c
nghĩa để tạo ra một tập tin đối tượng trung gian, chứ không phải là một thực thi.
ar rcs libout.a out.o
Điều này tạo thư viện tĩnh. r
có nghĩa là để chèn với thay thế, c
có nghĩa là để tạo một kho lưu trữ mới, và s
có nghĩa là để viết một chỉ mục. Như mọi khi, hãy xem man page để biết thêm thông tin.
9
Tạo tệp đối tượng bằng gcc, sau đó sử dụng ar
để nhóm chúng vào thư viện tĩnh.
50
Dưới đây là một đầy đủ makefile dụ:
makefile
TARGET = prog
$(TARGET): main.o lib.a
gcc $^ -o [email protected]
main.o: main.c
gcc -c $< -o [email protected]
lib.a: lib1.o lib2.o
ar rcs [email protected] $^
lib1.o: lib1.c lib1.h
gcc -c -o [email protected] $<
lib2.o: lib2.c lib2.h
gcc -c -o [email protected] $<
clean:
rm -f *.o *.a $(TARGET)
giải thích makefile:
target: prerequisites
- người đứng đầu cai trị[email protected]
- có nghĩa là mục tiêu .210
$^
- có nghĩa là tất cả các điều kiện tiên quyết$<
- có nghĩa là chỉ những điều kiện tiên quyết đầu tiênar
- một công cụ Linux để tạo, chỉnh sửa, và trích xuất từ kho lưu trữ see the man pages for further information. Các tùy chọn trong trường hợp này có nghĩa là:r
- thay thế các file đang tồn tại bên trong các kho lưu trữc
- tạo ra một kho lưu trữ nếu không đã tồn tạis
- tạo ra một chỉ số đối tượng tập tin vào kho lưu trữ
Để kết thúc: Thư viện tĩnh trong Linux không có gì khác ngoài lưu trữ tệp đối tượng.
main.csử dụng lib
#include <stdio.h>
#include "lib.h"
int main (void)
{
fun1(10);
fun2(10);
return 0;
}
lib.hlibs tiêu đề chính
#ifndef LIB_H_INCLUDED
#define LIB_H_INCLUDED
#include "lib1.h"
#include "lib2.h"
#endif
lib1.cnguồn lib đầu tiên
#include "lib1.h"
#include <stdio.h>
void fun1 (int x)
{
printf("%i\n",x);
}
lib1.htiêu đề tương ứng
#ifndef LIB1_H_INCLUDED
#define LIB1_H_INCLUDED
#ifdef __cplusplus
extern “C” {
#endif
void fun1 (int x);
#ifdef __cplusplus
}
#endif
#endif /* LIB1_H_INCLUDED */
lib2.cnguồn lib thứ hai
#include "lib2.h"
#include <stdio.h>
void fun2 (int x)
{
printf("%i\n",2*x);
}
lib2.htiêu đề tương ứng
#ifndef LIB2_H_INCLUDED
#define LIB2_H_INCLUDED
#ifdef __cplusplus
extern “C” {
#endif
void fun2 (int x);
#ifdef __cplusplus
}
#endif
#endif /* LIB2_H_INCLUDED */
Các vấn đề liên quan
- 1. Biên dịch một thư viện chia sẻ tĩnh
- 2. Làm thế nào để biên dịch ứng dụng C# với thư viện tĩnh C++?
- 3. Làm thế nào để sử dụng thư viện được biên dịch với MingW trong MSVC?
- 4. Làm thế nào để liên kết đến một thư viện tĩnh trong C?
- 5. Làm thế nào để biên dịch một thư viện tĩnh bằng cách sử dụng NDK của Android?
- 6. Biên dịch thư viện tĩnh cho iOS sử dụng OpenMP
- 7. Làm thế nào để lưu trữ một số phiên bản trong một thư viện tĩnh?
- 8. làm thế nào để biên dịch thư viện chủ đề tăng
- 9. Thư viện dex biên dịch
- 10. Liên kết thư viện được chia sẻ với thư viện tĩnh: thư viện tĩnh có được biên dịch khác với một ứng dụng đang liên kết nó không?
- 11. Làm thế nào để biên dịch nhị phân tĩnh?
- 12. Làm thế nào để bạn chạy thử nghiệm đơn vị của bạn? Cờ biên dịch? Thư viện tĩnh?
- 13. Làm cách nào để biên dịch một thư viện tĩnh (chất béo) cho armv6, armv7 và i386
- 14. linux g ++ liên kết 64 bit mã thư viện chia sẻ với thư viện tĩnh
- 15. Làm thế nào tôi có thể biên dịch lame thành thư viện tĩnh (.a) cho armv6 và armv7 của iPhone?
- 16. Làm thế nào để biên dịch chéo C++ - thư viện với các phụ thuộc?
- 17. Làm thế nào để biên dịch trong Visual Studio 2010 cho Linux
- 18. Làm thế nào để bao gồm thư viện tĩnh trong makefile
- 19. Làm cách nào để biên dịch Thư viện Dịch vụ WCF ở chế độ 32 bit?
- 20. thư viện biên dịch ZipArchive lỗi
- 21. Làm thế nào để sử dụng các thư viện tĩnh OpenCV 2.4 với Visual Studio?
- 22. Các thư viện tĩnh trong chương trình được biên dịch chéo
- 23. Làm thế nào để có được libcap (thư viện khả năng Linux) cho Android?
- 24. Trộn các thư viện tĩnh và thư viện chia sẻ
- 25. Cách xem nền tảng biên dịch của tệp thư viện tĩnh
- 26. biên dịch thư viện tĩnh C++ cho nền tảng Windows 64 bit bằng VS2008
- 27. Làm cách nào để biên dịch thư viện bằng mã nguồn bằng các công cụ NDK?
- 28. Liên kết các thư viện tĩnh, chia sẻ một thư viện tĩnh khác
- 29. Kết hợp các thư viện tĩnh
- 30. Làm thế nào để gọi thư viện c từ mã lắp ráp trên Linux?
Cảm ơn bạn đã giải thích. –
câu trả lời hay nhất là những câu trả lời phù hợp nhất với ví dụ, công việc tuyệt vời :) – Youda008
nó sẽ giúp chỉ ra những gì các lệnh làm và những gì họ dự định đạt được. đặc biệt trong trường hợp này, 'ar' cần giải thích, vì nó là chìa khóa để tạo thư viện tĩnh. – Joost