Ошибка связи: не удается найти -l & lt; путь к библиотеке & gt;

Я разрабатываю 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: добавлен скриншот
Снимок экрана: окно конфигурации CMake в kDevelop

1

Решение

Убедитесь, что библиотека существует, и вы добавляете -I «Путь к вашей libcryptopp» в каталоги, которые необходимо включить для сборки, если вам нужно связать библиотеку с -l

например: g ++ -o targettobjects -I «Путь к вашему libcryptopp» -lcryptopp

или же вы можете указать полный путь к libcryptopp
например: g ++ -o targettobjects «путь к libcryptopp из местоположения make-файла»

0

Другие решения

В моей практике это лучший способ узнать, существует ли ваша библиотека в системе, используя locate а также ld инструменты:

  1. разместить найти саму библиотеку в файловой системе:

    locate libssl.a
    

    НОТА что он может показать файловой системе узлы файлов, которые DONT существует больше использование updatedb Перед использованием locate,

  2. 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 правильно, чтобы это исправить.

0

При сборке проекта я получаю сообщение об ошибке в виде / 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Вам просто нужно найти место, где вы указываете дополнительные объектные файлы (потому что архив — это просто набор объектных файлов).

0
По вопросам рекламы [email protected]