2012-05-02 4 views
2

Я создал свой файл lib.a с несколькимиНеопределенная ссылка на мою собственную библиотеку

gcc -c file.c -o file.o 

затем

ar sr lib/libtest.a file1.o file2.o file3.o 

подтвержденного

ar -t lib/libtest.a 
file1.o 
file2.o 
file3.o 

, но когда я пытаюсь скомпилировать приложение к испытаниям

gcc lib/libtest.a test.c -o test 

Я получил неопределенную ссылку на функцию main: к используемой функции от file1.o, file2.o, file3.o

+0

См. [Параметры ссылки GCC] (http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html). – hmjd

ответ

6

вопросам заказа с библиотеками - попробовать:

gcc test.c -o test lib/libtest.a 

В основном, линкер читает библиотеку, когда она попадает в нее в список входных файлов (это может быть не совсем так, как все работает, но я думаю, что это хорошо работает как правило) и разрешит оставшиеся неопределенные ссылки. Когда он перейдет к следующему входу, он не будет снова искать эту библиотеку для любых новых неразрешенных ссылок, которые он собирает на этом пути.

(Примечание: существуют определенные параметры компоновщика, которые могут изменить это поведение, но они, по-видимому, редко используются и, вероятно, имеют свой собственный набор недостатков, поэтому я не обсуждаю их здесь. Подобная проблема обычно устраняется переупорядочение списка входных файлов компоновщика).

+1

+1 на этом. Обратите внимание, что это действительно проблема со статическими библиотеками, так как ld выберет, какие из объектных файлов из архива свяжутся с. Существует '- whole-archive', который, возможно, является одним из тех экзотических вариантов, о которых вы упоминали, но опять же необычен и не идеален (потому что вы можете связываться с потенциально большим блобом). Однако полезно, если вы включаете это в сам код библиотеки (т. Е. Создаете .so из нескольких .a). –

Смежные вопросы