2010-03-19 38 views
5

Thật dễ dàng để cho chương trình tìm ra sự phụ thuộc vào thời gian biên dịch, (với gcc -MM). Tuy nhiên, sự phụ thuộc liên kết (quyết định thư viện nào nên được liên kết đến) dường như khó tìm ra. Vấn đề này trở nên nổi lên khi nhiều mục tiêu với các thư viện cá nhân liên kết đến là cần thiết.Phụ thuộc liên kết tự động của Makefile?

Ví dụ: ba mục tiêu thư viện động t1.so, t2.so và t3.so cần được tạo. t1.so cần thư viện toán học (-lm), trong khi t2 và t3 thì không. Sẽ là tẻ nhạt khi viết các quy tắc riêng biệt. Một quy tắc duy nhất yêu cầu ba mục tiêu được liên kết với thư viện toán học sẽ tiết kiệm được sự cố. Tuy nhiên, nó gây ra lạm phát kích thước mục tiêu vì thư viện toán học không được sử dụng cho t2.so và t3.so.

Bất kỳ ý tưởng nào?

Trả lời

1

Điều này không dễ tìm ra khi tìm tiêu đề cần thiết. gcc -MM chỉ là một số cách ưa thích để sử dụng bộ tiền xử lý, nhưng nó biết khá nhiều về cách mã được sử dụng hoặc hoạt động: bạn có thể bao gồm một số tiêu đề đầy đủ các phụ thuộc thư viện phụ thuộc phức tạp của #define.

Tôi sẽ gắn bó với việc viết các phụ thuộc liên kết rõ ràng cho tất cả các mục tiêu (3 trong trường hợp của bạn). Bạn có thể thu thập các phụ thuộc phổ biến trong LDFLAGS.

1

Có vẻ như tùy chọn ld 's --trace là một khởi đầu tốt. Đầu ra cần định dạng, nhưng tôi nghĩ nó chứa tất cả thông tin chính xác.

gọi tôi trông giống như sau:

$ g++ -o foo a.o b.o -l sfml-graphics -l sfml-window -Wl,--trace 
/usr/bin/ld: mode elf_i386 
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crt1.o 
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crti.o 
/usr/lib/gcc/i686-linux-gnu/4.6/crtbegin.o 
a.o 
b.o 
-lsfml-graphics (/usr/lib/gcc/i686-linux-gnu/4.6/../../../../lib/libsfml-graphics.so) 
-lsfml-window (/usr/lib/gcc/i686-linux-gnu/4.6/../../../../lib/libsfml-window.so) 
-lstdc++ (/usr/lib/gcc/i686-linux-gnu/4.6/libstdc++.so) 
-lm (/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/libm.so) 
-lgcc_s (/usr/lib/gcc/i686-linux-gnu/4.6/libgcc_s.so) 
/lib/i386-linux-gnu/libc.so.6 
(/usr/lib/i386-linux-gnu/libc_nonshared.a)elf-init.oS 
/lib/i386-linux-gnu/ld-linux.so.2 
-lgcc_s (/usr/lib/gcc/i686-linux-gnu/4.6/libgcc_s.so) 
/usr/lib/gcc/i686-linux-gnu/4.6/crtend.o 
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crtn.o 
0

Các bạn đã thử sử dụng 'nm'? Nó cung cấp cho bạn một danh sách các biểu tượng được xác định và không xác định trong đối tượng/tập tin thư viện (xem tài liệu here

Có một cách tiếp cận nêu tại post này bởi Bernd Strieder mà tôi đang xem xét sử dụng -.

1. Use nm to generate a list of symbols in all object/library files involved. 
2. This file is parsed and basically the (U)ndefined and (T)ext symbols 
    and the symbols of main functions are filtered out and mapped to their 
    object files. I found that U and T symbols suffice, which reduces the 
    overall problem considerably compared to the linker, which has to 
    consider all symbols. 
3. The transitive hull of the dependency relation according to U and T 
    symbols between object files is being calculated. 
4. A list of object files needed to resolve all dependencies can be 
    printed for any object file. 
5. For any main object file, a make target to link it is arranged. 
+0

Liên kết để gửi là bị hỏng. – rudolfbyker

Các vấn đề liên quan