Я разрабатываю C++
проект в Ubuntu
с kDevelop
в качестве IDE. Проект использует openssl boost cryptopp
библиотеки. При создании проекта я получаю сообщение об ошибке как /usr/bin/ld: cannot find -l/home/anz/openssl-1.0.1j/libssl.a
,
Насколько я знаю, -l
приходит вместе с именем библиотеки (например, -lcryptopp), а не ее путем. Но почему -l
присутствует здесь до пути? Указанная библиотека существует в этом пути.
Как я могу преодолеть эту проблему? Спасибо.
РЕДАКТИРОВАТЬ:
Часть из Cmakelists.txt:
set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREADED ON)
find_package( Boost COMPONENTS thread system date_time regex filesystem chrono)
include_directories(${Boost_INCLUDE_DIRS})
find_package (OpenSSL)
include_directories(${OPENSSL_INCLUDE_DIR})
message("LINKED :" ${OPENSSL_LIBRARIES}) # ALL THE LIBRARIES ARE LISTED HERE CORECTLY
ADD_EXECUTABLE(Abc ${Abc_SRC})
TARGET_LINK_LIBRARIES(Abc ${Boost_LIBRARIES})
TARGET_LINK_LIBRARIES(Abc ${OPENSSL_LIBRARIES})
target_link_libraries(Abc ${CMAKE_DL_LIBS})
install(TARGETS Abc RUNTIME DESTINATION ./)
EDIT2: добавлен скриншот
Убедитесь, что библиотека существует, и вы добавляете -I «Путь к вашей libcryptopp» в каталоги, которые необходимо включить для сборки, если вам нужно связать библиотеку с -l
например: g ++ -o targettobjects -I «Путь к вашему libcryptopp» -lcryptopp
или же вы можете указать полный путь к libcryptopp
например: g ++ -o targettobjects «путь к libcryptopp из местоположения make-файла»
В моей практике это лучший способ узнать, существует ли ваша библиотека в системе, используя locate
а также ld
инструменты:
разместить найти саму библиотеку в файловой системе:
locate libssl.a
НОТА что он может показать файловой системе узлы файлов, которые DONT существует больше использование updatedb
Перед использованием locate
,
ld -lssl --verbose
найти библиотеку по компоновщику, который использует систему LD_LIBRARY_PATH
переменная:
:~$ ld -lssl --verbose
attempt to open /usr/x86_64-linux-gnu/lib64/libssl.so failed
attempt to open /usr/x86_64-linux-gnu/lib64/libssl.a failed
attempt to open /usr/local/lib/x86_64-linux-gnu/libssl.so failed
attempt to open /usr/local/lib/x86_64-linux-gnu/libssl.a failed
attempt to open /usr/local/lib64/libssl.so failed
attempt to open /usr/local/lib64/libssl.a failed
attempt to open /lib/x86_64-linux-gnu/libssl.so failed
attempt to open /lib/x86_64-linux-gnu/libssl.a failed
attempt to open /lib64/libssl.so failed
attempt to open /lib64/libssl.a failed
attempt to open /usr/lib/x86_64-linux-gnu/libssl.so succeeded
-lssl (/usr/lib/x86_64-linux-gnu/libssl.so)
libcrypto.so.1.0.0 needed by /usr/lib/x86_64-linux-gnu/libssl.so
found libcrypto.so.1.0.0 at /lib/x86_64-linux-gnu/libcrypto.so.1.0.0
libc.so.6 needed by /usr/lib/x86_64-linux-gnu/libssl.so
found libc.so.6 at /lib/x86_64-linux-gnu/libc.so.6
libdl.so.2 needed by /lib/x86_64-linux-gnu/libcrypto.so.1.0.0
found libdl.so.2 at /lib/x86_64-linux-gnu/libdl.so.2
ld-linux-x86-64.so.2 needed by /lib/x86_64-linux-gnu/libc.so.6
found ld-linux-x86-64.so.2 at /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
ld: warning: cannot find entry symbol _start; not setting start address
Вы получите такое поведение, когда попытаетесь найти его.
Итак, что происходит, когда вы пытаетесь найти libssl.a
на самом деле, что выполняет ld tool? Вы можете попытаться исследовать это, запустив ld -l/home/anz/openssl-1.0.1j/libssl.a --verbose
:
ld -l/home/anz/openssl-1.0.1j/libssl.a --verbose`
attempt to open /usr/x86_64-linux-gnu/lib64/lib/home/anz/openssl-1.0.1j/libssl.a.so failed
attempt to open /usr/x86_64-linux-gnu/lib64/lib/home/anz/openssl-1.0.1j/libssl.a.a failed
attempt to open /usr/local/lib/x86_64-linux-gnu/lib/home/anz/openssl-1.0.1j/libssl.a.so failed
attempt to open /usr/local/lib/x86_64-linux-gnu/lib/home/anz/openssl-1.0.1j/libssl.a.a failed
attempt to open /usr/local/lib64/lib/home/anz/openssl-1.0.1j/libssl.a.so failed
attempt to open /usr/local/lib64/lib/home/anz/openssl-1.0.1j/libssl.a.a failed
attempt to open /lib/x86_64-linux-gnu/lib/home/anz/openssl-1.0.1j/libssl.a.so failed
attempt to open /lib/x86_64-linux-gnu/lib/home/anz/openssl-1.0.1j/libssl.a.a failed
attempt to open /lib64/lib/home/anz/openssl-1.0.1j/libssl.a.so failed
attempt to open /lib64/lib/home/anz/openssl-1.0.1j/libssl.a.a failed
attempt to open /usr/lib/x86_64-linux-gnu/lib/home/anz/openssl-1.0.1j/libssl.a.so failed
attempt to open /usr/lib/x86_64-linux-gnu/lib/home/anz/openssl-1.0.1j/libssl.a.a failed
attempt to open /usr/lib64/lib/home/anz/openssl-1.0.1j/libssl.a.so failed
attempt to open /usr/lib64/lib/home/anz/openssl-1.0.1j/libssl.a.a failed
attempt to open /usr/x86_64-linux-gnu/lib/lib/home/anz/openssl-1.0.1j/libssl.a.so failed
attempt to open /usr/x86_64-linux-gnu/lib/lib/home/anz/openssl-1.0.1j/libssl.a.a failed
attempt to open /usr/local/lib/lib/home/anz/openssl-1.0.1j/libssl.a.so failed
attempt to open /usr/local/lib/lib/home/anz/openssl-1.0.1j/libssl.a.a failed
attempt to open /lib/lib/home/anz/openssl-1.0.1j/libssl.a.so failed
attempt to open /lib/lib/home/anz/openssl-1.0.1j/libssl.a.a failed
attempt to open /usr/lib/lib/home/anz/openssl-1.0.1j/libssl.a.so failed
attempt to open /usr/lib/lib/home/anz/openssl-1.0.1j/libssl.a.a failed
ld: cannot find -l/home/anz/openssl-1.0.1j/libssl.a
Если бы вы знали, что -l
а также -L
ld-options означает, что вы точно знаете, что он делает: все после -l
имя библиотеки, которую вы ищете и хотите связать; -L
задает путь (добавляется к собственному списку компоновщика во время процесса компоновки), где искать ваши библиотеки.
Отредактируйте свой CMakeLists.txt
правильно, чтобы это исправить.
При сборке проекта я получаю сообщение об ошибке в виде / usr / bin / ld: не могу найти -l / home / anz / openssl-1.0.1j / libssl.a
Архив (libssl.a
) представляет собой набор объектных файлов. Таким образом, вы используете его в этом случае, как и любой другой объектный файл. Там нет необходимости для -l
:
gcc foo.o bar.o -o baz.exe
В вашем случае что-то вроде:
gcc foo.o bar.o /home/anz/openssl-1.0.1j/libssl.a -o baz.exe
Я часто использую одни и те же методы для обеспечения связи со статической версией библиотек, поскольку она переносима между Mac OS X, Linux и BSD. -Bstatic
, -L
а также -l
являются не переносимый, потому что OS X всегда связывается с динамической библиотекой, если доступно.
В KDevelop
Вам просто нужно найти место, где вы указываете дополнительные объектные файлы (потому что архив — это просто набор объектных файлов).