1

我正在开发一个作为 IDE的C++项目。该项目使用库。在构建项目时,我收到链接错误为.UbuntukDevelopopenssl 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:添加了屏幕截图 kDevelop 中 CMake 配置窗口的屏幕截图

4

3 回答 3

0

确保该库存在并将 -I"Path to your libcryptopp" 添加到需要包含用于构建的目录中,如果您需要使用 -l 链接库

例如:g++ -o targetobjects -I"你的 libcryptopp 的路径" -lcryptopp

否则您可以提供 libcryptopp 的完整路径,例如: g++ -o targetobjects "从 makefile 位置到 libcryptopp 的路径"

于 2015-01-28T06:19:13.113 回答
0

在构建项目时,我收到链接错误为 /usr/bin/ld: cannot find -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中,您只需要找到您指定附加目标文件的位置(因为存档只是目标文件的集合)。

于 2015-01-28T22:40:59.037 回答
0

在我的实践中,最好的方法是查找系统中是否存在您的库正在使用locateld工具:

  1. 在文件系统上找到库本身:

    locate libssl.a
    

    请注意,它可以显示不再存在的文件的文件系统节点。使用updatedb前使用locate

  2. ld -lssl --verboseLD_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 工具执行什么操作时会发生什么?您可以尝试通过运行来调查它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-Lld-options 意味着你就会知道它到底做了什么:后面的所有内容-l都是你搜索并想要链接的库名称;-L设置搜索库的路径(在链接过程中附加到链接器自己的列表)。

正确编辑您CMakeLists.txt的内容以解决此问题。

于 2015-01-28T09:50:23.413 回答