Вопрос по undefined-reference, c, static-libraries, ar, gcc – Неопределенная ссылка на мою собственную библиотеку

2

Я создал файл lib.a с несколькими

<code>gcc -c file.c -o file.o
</code>

затем

<code>ar sr lib/libtest.a file1.o file2.o file3.o
</code>

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

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

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

<code>gcc lib/libtest.a test.c -o test
</code>

Я получил неопределенную ссылку в функцииmain: to used function from file1.o, file2.o, file3.o

УвидетьGCC Link Options. hmjd

Ваш Ответ

1   ответ
6

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

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

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

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

Похожие вопросы