У меня есть статическая библиотека liborc-0.4.a без общей библиотеки. У меня есть другая библиотека, libschroedinger-1.0.a (нет общего), которая зависит от символов в liborc-0.4.a. Если я запускаю nm на liborc-0.4.a, символы, такие как orc_init, отображаются как T (что означает, что они определены). Я построил libschroedinger-1.0.a с флагом командной строки -lorc-0.4, чтобы он увидел символы и был в порядке.
Однако теперь у меня есть небольшой исполняемый файл, который зависит от libschroedinger-1.0.a. Он компилируется отлично, но когда я запускаю компоновщик
gcc -lschroedinger-1.0 -lorc-0.4 -o output input.o
Он дает такие ошибки, как:
/usr/local/lib/libschroedinger-1.0.a(libschroedinger_1.0_la-schro.o):schro.c:(.text+0x21): undefined reference to `orc_init'
gcc
чувствителен к порядку библиотек. Когда он компилирует liborc-0.4.a
в, нет необходимости в orc_init
, поэтому он не включен. Решение состоит в том, чтобы положить LDFLAGS
в конец команды:
gcc -o output input.o -lschroedinger-1.0 -lorc-0.4
Вы, скорее всего, скомпилировали libschroedinger с общим liborc. Статическая библиотека такая же, как куча объектных файлов в архиве, поэтому им не нужно видеть больше, чем заголовки. Напишите, например, следующее: (те же яблоки для liborc).
gcc /path/to/libschroedinger-1.0.a /path/to/liborc-0.4.a -o output input.o