Ошибка Linker в Linux: "undefined ссылка на"

Я могу создать общую библиотеку без проблем. Я создаю libcbitcoin.so(без ошибок) и пытаюсь связать его с исполняемым файлом, а также с библиотеками OpenSSL. Я использую эту команду:

gcc -L/media/sf_BitEagle_Projects/cbitcoin/build/bin -lcbitcoin \
-Wl-rpath,/media/sf_BitEagle_Projects/cbitcoin/build/bin -lssl -lcrypto \
-L/usr/local/ssl/lib/ -o /media/sf_BitEagle_Projects/cbitcoin/build/bin/testCBAddress \
/media/sf_BitEagle_Projects/cbitcoin/build/obj/testCBAddress.o \
/media/sf_BitEagle_Projects/cbitcoin/build/obj/CBOpenSSLCrypto.o

Каталог bin - это расположение библиотеки. В каталоге obj есть объектные файлы, которые я хочу связать с исполняемым файлом. В команде я использую опции -L, -l и -rpath, которые, как я думал, все, что необходимо для связывания в Linux. Кажется, я ошибаюсь, так как получаю такие ошибки, как:

/media/sf_BitEagle_Projects/cbitcoin/test/testCBAddress.c:40:
undefined reference to `CBNewByteArrayFromString'

CBNewByteArrayFromString находится в библиотеке. По какой-то причине это не связано. OpenSSL тоже:

/media/sf_BitEagle_Projects/cbitcoin/dependencies/crypto/CBOpenSSLCrypto.c:37:
undefined reference to `SHA1'

Как заставить ссылку работать?

Версия GCC: gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

В Linux Mint 13

Спасибо.

Ответ 1

Поместите библиотеки после объектных файлов в командной строке ссылки:

gcc /media/sf_BitEagle_Projects/cbitcoin/build/obj/testCBAddress.o \
    /media/sf_BitEagle_Projects/cbitcoin/build/obj/CBOpenSSLCrypto.o \
    -L/media/sf_BitEagle_Projects/cbitcoin/build/bin \
    -lcbitcoin -Wl-rpath,/media/sf_BitEagle_Projects/cbitcoin/build/bin \
    -L/usr/local/ssl/lib/ -lssl -lcrypto \
    -o /media/sf_BitEagle_Projects/cbitcoin/build/bin/testCBAddress

Если вы этого не сделаете, компоновщик может решить, что ему ничего не нужно из конкретной библиотеки на этапе ссылки, где он сканирует библиотеку, а затем не будет повторно сканировать библиотеку позже, после того как она найдет некоторые undefined в объектных файлах. Если вы сначала поместите объектные файлы, вы не столкнетесь с этой проблемой.

Ответ 2

Я думаю, что это вызвано тем, что НЕ может найти символ, gcc сначала пройдет слева, попробуйте поместить файл lib в конец