Makefile автоматическая зависимость ссылки? - PullRequest
5 голосов
/ 19 марта 2010

Легко позволить программе выяснить зависимость во время компиляции (с помощью gcc -MM). Тем не менее, зависимость от ссылки (решение, с какими библиотеками следует связать) кажется трудной для понимания. Эта проблема возникает, когда требуется несколько целей с отдельными библиотеками для ссылки.

Например, необходимо создать три динамические цели библиотеки t1.so, t2.so и t3.so. Для t1.so нужна математическая библиотека (-lm), а для t2 и t3 - нет. Было бы утомительно писать отдельные правила. Единственное правило, требующее трех целей, связанных с библиотекой математики, избавляет от проблем. Однако это вызывает инфляцию целевого размера, поскольку математическая библиотека не используется для t2.so и t3.so.

Есть идеи?

Ответы [ 3 ]

1 голос
/ 07 августа 2012

Похоже, опция ld --trace - хорошее начало. Вывод требует форматирования, но я думаю, что он содержит всю необходимую информацию.

Мой вызов выглядит примерно так:

$ 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
1 голос
/ 19 марта 2010

Это не так просто выяснить, как найти необходимые заголовки. gcc -MM - это просто какой-то причудливый способ использования препроцессора, но он почти ничего не знает о том, как код используется или работает: вы можете включить несколько заголовков, заполненных #define, или ввести сложные зависимости библиотек зависимостей.

Я бы придерживался написания явных зависимостей связывания для всех целей (3 в вашем случае). Вы можете собрать общие зависимости в LDFLAGS.

0 голосов
/ 25 августа 2012

Вы пытались использовать 'nm'? Он дает вам список определенных и неопределенных символов в объектных / библиотечных файлах (см. Документацию здесь .

В этой публикации есть подход, упомянутый Берндом Стридером, который я собираюсь использовать -

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.
...