gpt4 book ai didi

c++ - 在/usr/local/lib 下找不到库

转载 作者:行者123 更新时间:2023-11-28 04:31:52 25 4
gpt4 key购买 nike

当我使用 CMakeLists.txt 时:

find_library(cryptoppV libcryptopp.a)

target_link_libraries(${PROJenter code hereECT_NAME} ${cryptoppV})

然后我可以在/usr/local/lib下找到一个库,并使C++程序正确并得到正确的结果。

但是当我将它替换为:

-- find_library(cryptoppV libcryptopp.a)
target_link_libraries(${PROJECT_NAME} cryptopp)

然后我得到错误信息:

ld: library not found for -lcryptopp

为什么cmake默认不链接/usr/local/lib?我做错了什么吗?

-- 由 aijinsong 添加,2018 年 10 月 7 日上午 6:37

我更糊涂了。当 CMakeLists.txt 是:

set(SOURCE_FILES main.cpp)
add_executable(${PROJECT_NAME} ${SOURCE_FILES})
find_package(Boost 1.58 REQUIRED thread)
target_link_libraries(${PROJECT_NAME} Boost::thread)
find_library(cryptoppV libcryptopp.a)
target_link_libraries(${PROJECT_NAME} ${cryptoppV})

编译器可以找到cryptopp/sha.h。但是当 CMakeLists.txt 是:

set(SOURCE_FILES main.cpp)
add_executable(${PROJECT_NAME} ${SOURCE_FILES})
## find_package(Boost 1.58 REQUIRED thread)
## target_link_libraries(${PROJECT_NAME} Boost::thread)
find_library(cryptoppV libcryptopp.a)
target_link_libraries(${PROJECT_NAME} ${cryptoppV})

错误信息是:

fatal error: 'cryptopp/sha.h' file not found
#include <cryptopp/sha.h>

当 CMakeLists.txt 是:

set(SOURCE_FILES main.cpp)
add_executable(${PROJECT_NAME} ${SOURCE_FILES})
find_package(Boost 1.58 REQUIRED thread)
## target_link_libraries(${PROJECT_NAME} Boost::thread)
find_library(cryptoppV libcryptopp.a)
target_link_libraries(${PROJECT_NAME} ${cryptoppV})

错误信息仍然是:

fatal error: 'cryptopp/sha.h' file not found
#include <cryptopp/sha.h>

为什么我使用 cmake 要求我与库 Boost::thread 链接的 cryptopp?我更困惑了。

-- 由 aijinsong 添加,2018 年 10 月 7 日上午 11:56

如果我使用 g++ main.cpp -o main -lcryptopp,我可以获得正确的结果。这表明库 cryptopp 已经正确安装,并且 g++ 可以找到该库。为什么我用 make 做的时候找不到库?

-- 为 KamilCuk 开始添加

-- 由 aijinsong 添加于 2018 年 10 月 7 日下午 3:27

当我通过 make VERBOSE=1 实现时,我收到以下消息:

cd/Users/aijinsong/Documents/projects/com.aijs.cxx/bolochain/src &&/usr/local/Cellar/cmake/3.12.3/bin/cmake -E cmake_link_script CMakeFiles/bolochain.dir/link.txt --verbose=1

link.txt 中的文本是: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -g -isysroot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/bolochain.dir/main.cpp.o -o bolochain/usr/local/lib/libboost_thread-mt.dylib -lcryptopp/usr/local/lib/libboost_chrono-mt.dylib/usr/local/lib/libboost_system-mt.dylib/usr/local/lib/libboost_date_time-mt.dylib/usr/local/lib/libboost_atomic-mt.dylib

此命令导致链接失败,但是当我像下面这样编辑它时,C++ 链接命令处理得很好: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -g -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/bolochain.dir/main.cpp.o -o bolochain/usr/local/lib/libboost_thread-mt.dylib -lcryptopp/usr/local/lib/libboost_chrono-mt.dylib/usr/local/lib/libboost_system-mt.dylib/usr/local/lib/libboost_date_time-mt. dylib/usr/local/lib/libboost_atomic-mt.dylib

只需删除: -isysroot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk

我还在研究这个问题。

-- 为 KamilCuk end 添加

最佳答案

拳头,谢谢@Kamil Cuk。参数 -VERBOSE=1 非常有用,我可以获得更多详细信息,告诉我在使用 make 时会发生什么。

重点是我在OSX系统下使用cmake的时候。它将生成一个名为'link.txt'的txt,其中包括命令,其中的一部分如下:-isysroot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk

当我删除这部分时,命令将正确执行。但是当我添加这一行时,命令执行错误。所以重点是这一行可能限制了 c++ 的搜索路径。谢谢@tsyvarev。你是对的,-isysroot 限制了 c++ 链接器搜索 /usr/local/lib

其次,我没有找到如何删除 OSX cmake 生成的 -isysroot ... 行。所以,我需要找到另一种解决方案。

当我搜索有关find_package/include_directories/target_link_libraries的更多信息时,我发现find_package需要一个FindXXX.cmake文件来帮助它找到目标的头文件和库。所以我用谷歌搜索了一个 FindCyptoPP.cmake 文件。在这个文件中,它找到了两个变量,一个是 cryptopp 的头目录路径的值,一个是 cryptopp 的库路径的值。然后我使用 include_directories/target_link_libraries 如下,问题 war 解决了。

find_package(CryptoPP)
include_directories(${CRYPTOPP_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${CRYPTOPP_LIBRARIES})

然后当我使用 make -VERBOSE = 1 时,我喜欢当我使用 CMakeLists.txt 时输出有点不同,如下所示:

target_link_libraries(${PROJECT_NAME} cryptopp)

当我使用三行时,输出包含一行 /usr/local/lib/libcryptopp.dylib。当我使用一行时,输出包含一行 -lcryptopp

因此,使用命令行 -isysroot,命令行 -lcryptopp 将在 -isysroot 定义的目录下搜索库,并且在该目录下,没有名为cryptopp 的库,而是在/usr/local/lib 下。但是使用命令行/usr/local/lib/libcryptopp.dylib,它给出了库的绝对路径,所以链接只做链接任务,不需要搜索。再次感谢@Kamil Cuk。

第三,我知道 include_directories/target_link_libraries 是两个独立的步骤,一个用于包含头文件,一个用于链接库。

不过,还有一些问题没有解决:- 如何删除-isysroot?- 如何创建 FindXXX.cmake 文件?- 如何将 /usr/local/lib 作为默认搜索目录,这是一种实践方法吗?

我会继续研究它们,并在几天或几周后回来。

关于c++ - 在/usr/local/lib 下找不到库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52679871/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com