Ошибка компоновщика: неопределенная ссылка на общий объект

#c #compilation #linker #makefile #shared-libraries

#c #Сборник #компоновщик #makefile #разделяемые библиотеки

Вопрос:

Я пытаюсь использовать внешнюю библиотеку, вызываемую iniparser в моей программе на C. Я использую gcc 4.4.

Я помещаю iniparser библиотеку в подкаталог с именем lib/ заголовочные файлы находятся в lib / iniparser / src, и библиотека компилируется lib/iniparser/libiniparser.so.0 .

Я написал короткий Makefile для его компиляции, вот результат make :

 gcc -Wall -Wextra -Werror -c -I include/ src/smag_main.c -L lib/iniparser -liniparser -I lib/iniparser/src
gcc -Wall -Wextra -Werror -c -I include/ -L lib/iniparser -liniparser -I lib/iniparser/src src/agros.c
gcc -Wall -Wextra -Werror -c -I include/ -L lib/iniparser -liniparser -I lib/iniparser/src src/main.c
gcc -Wall -Wextra -Werror -L lib/iniparser -liniparser -o agros smag_main.o main.o agros.o
smag_main.o: In function `sec_haskey':
smag_main.c:(.text 0xa9): undefined reference to `iniparser_find_entry'
smag_main.o: In function `parse_config':
smag_main.c:(.text 0x153): undefined reference to `iniparser_load'
smag_main.c:(.text 0x18b): undefined reference to `iniparser_getint'
smag_main.c:(.text 0x1c6): undefined reference to `iniparser_getstring'
smag_main.c:(.text 0x202): undefined reference to `iniparser_getstring'
smag_main.c:(.text 0x261): undefined reference to `iniparser_getstring'
smag_main.c:(.text 0x2c2): undefined reference to `iniparser_getint'
smag_main.c:(.text 0x2d5): undefined reference to `iniparser_freedict'
collect2: ld returned 1 exit status
make: *** [agros] Error 1
  

Первый вызов gcc smag_main.o успешно компилируется, второй компилируется agros.o и третий main.o . 4-й вызов — это компоновщик, который свяжет все эти объекты в исполняемый agros файл. Очевидно, что это сбой.

Похоже, у него проблемы с поиском iniparser.so во время компоновки. Почему мой вызов неправильный?
Я в замешательстве.

(Альтернативный вопрос, если бы кто-нибудь мог объяснить, как связать, вызвав ld напрямую, это было бы здорово).

Ответ №1:

Попробуйте поместить символическую ссылку из libiniparser.so.0 в libiniparser.so

  cd lib/iniparser/
 ln -s libiniparser.so.0 libiniparser.so
  

Комментарии:

1. Когда вы даете команду -liniparser, компоновщик ищет библиотеку с определенным именем. В основном libiniparser.a (для статической библиотеки) или libiniparser.so (для общей библиотеки). Есть причины иметь файл с именем libiniparser.so.0 Для получения более подробной информации смотрите Здесь: tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html