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

Я могу сделать общую библиотеку без проблем. Я создаю libcbitcoin.итак (без ошибок) и попытайтесь связать его с исполняемым файлом, а также библиотеками 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

спасибо.

2 ответов


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

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

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


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