Ошибка компоновщика в 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 в конце