2012-07-05 24 views
22

Tôi đã sau makefileLàm thế nào để bao gồm thư viện tĩnh trong makefile

CXXFILES = pthreads.cpp 

CXXFLAGS = -O3 -o prog -rdynamic -D_GNU_SOURCE -L./libmine 
LIBS = -lpthread -ldl 

all: 
    $(CXX) $(CXXFILES) $(LIBS) $(CXXFLAGS) 

clean: 
    rm -f prog *.o 

Tôi cố gắng để bao gồm các thư viện ./libmine trong CXXFLAGS, nhưng nó có vẻ như nó không phải là cách đúng đắn để bao gồm thư viện tĩnh, bởi vì khi tôi biên dịch chương trình, tôi nhận được nhiều lỗi tham chiếu không xác định. Vì vậy, những gì thực sự là đúng cách để bao gồm một thư viện tĩnh trong makefile?

Trả lời

13
CXXFLAGS = -O3 -o prog -rdynamic -D_GNU_SOURCE -L./libmine 
LIBS = libmine.a -lpthread 
+2

Bạn có thể giải thích một chút về cách thức hoạt động của nó không? – Tony

+4

OP đã thêm '-L./Libmine' vào phần biên dịch' gcc' và liên kết nhưng không thêm 'libmine.a'. '-L./Libmine' yêu cầu' gcc' nhìn vào thư mục './Libmine' để tìm kiếm các tệp đối tượng và thư viện. Thêm 'libmine.a' cho' gcc' bạn muốn liên kết tệp thực thi của bạn với thư viện 'libmine.a'. – ouah

+0

LIBS = libmine.a không hoạt động với -L./libmine. – fchen

8

-L chỉ cung cấp đường dẫn tìm tệp .a hoặc .so. Những gì bạn đang tìm kiếm là thêm -lmine vào biến số LIBS.

Làm điều đó -static -lmine để buộc nó chọn thư viện tĩnh (trong trường hợp cả thư viện tĩnh và động tồn tại).

+0

Tôi đọc về cờ '-static', nhưng tôi lo ngại rằng' -static' sẽ làm cho tất cả các lib được tham chiếu tĩnh, khi tôi chỉ muốn một. '-static' sẽ chỉ đánh dấu tham chiếu tiến trình là tĩnh? – Blake

+1

@ Cokemonkey11: bất kỳ thư viện nào sau '-static' đều thích phiên bản tĩnh của thư viện, vâng. – 0xC0000022L

+0

@ 0xC00000022L vì vậy nếu tôi làm '-static -lfoo -bar', cả foo và thanh sẽ là tĩnh? Tôi chỉ muốn foo được tĩnh - đó là những gì tôi đã cố gắng để yêu cầu. Chỉnh sửa: Tôi chỉ muốn foo được * rõ ràng * tĩnh, trong khi tôi muốn thanh có hành vi liên kết tiêu chuẩn. – Blake

34

sử dụng

LDFLAGS= -L<Directory where the library resides> -l<library name> 

Giống như:

LDFLAGS = -L. -lmine 

để đảm bảo biên soạn tĩnh bạn cũng có thể thêm

LDFLAGS = -static 

Hoặc bạn chỉ có thể thoát khỏi toàn bộ tìm kiếm thư viện, và liên kết với nó trực tiếp.

nói rằng bạn có main.c fun.c

và thư viện tĩnh libmine.a

sau đó bạn chỉ có thể làm trong bạn đường liên kết cuối cùng của Makefile

$(CC) $(CFLAGS) main.o fun.o libmine.a 
các
11

Đảm bảo rằng tùy chọn -L xuất hiện trước tùy chọn -l; thứ tự các tùy chọn trong các dòng lệnh liên kết không, đặc biệt là với các thư viện tĩnh. Tùy chọn -L chỉ định thư mục được tìm kiếm cho thư viện (tĩnh hoặc được chia sẻ). Tùy chọn -lname chỉ định thư viện có libmine.a (tĩnh) hoặc libmine.so (được chia sẻ trên hầu hết các biến thể của Unix, nhưng Mac OS X sử dụng .dylib và HP-UX được sử dụng để sử dụng .sl). Thông thường, một thư viện tĩnh sẽ nằm trong một tệp libmine.a. Đây là quy ước, không bắt buộc, nhưng nếu tên không ở định dạng libmine.a, bạn không thể sử dụng ký hiệu -lmine để tìm nó; bạn phải liệt kê nó một cách rõ ràng trên dòng lệnh trình biên dịch (linker).

Tùy chọn -L./libmine cho biết "có một thư mục con được gọi là libmine có thể tìm kiếm để tìm thư viện". Tôi có thể thấy ba khả năng:

  1. Bạn có một thư mục con như vậy chứa libmine.a, trong trường hợp này bạn cũng cần phải thêm -lmine vào dòng liên kết (sau khi các tập tin đối tượng mà tham khảo thư viện).
  2. Bạn có một tệp libmine là một tệp lưu trữ tĩnh, trong trường hợp đó bạn chỉ cần liệt kê tệp dưới dạng tệp ./libmine không có -L ở phía trước.
  3. Bạn có một tệp libmine.a trong thư mục hiện tại mà bạn muốn nhận. Bạn có thể viết ./libmine.a hoặc -L . -lmine và cả hai sẽ tìm thấy thư viện.
Các vấn đề liên quan