繁体   English   中英

在/ usr / local / lib下找不到库

[英]cannot find library under /usr/local/lib

当我使用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>

为什么我使用cryptop,即cmake要求我与库Boost :: thread链接? 我更加困惑。

- 由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

并且/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的文本为: /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结束

拳头,谢谢@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,解决了战争的问题。

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。

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

但是,仍然存在一些无法解决的问题:-如何删除-isysroot? -如何创建FindXXX.cmake文件? -如何将/usr/local/lib为默认搜索目录,这是一种实践方法?

我将继续研究它们,几天或几周后再回来。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM