c++ - 使用 CMake 在 macOS 中链接 .so 库时出错

标签 c++ cmake dynamic-linking

我正在尝试使用 CMake 链接名为 libtwitcurl.so.1 的 .so 文件。我的 Cmake 文件如下所示:

cmake_minimum_required(VERSION 3.8)
project(MarkoTweeter)

set(CMAKE_CXX_STANDARD 14)

set(SOURCE_FILES main.cpp markov/markov_chain.cpp markov/markov_chain.h libraries libraries/curl)
include_directories(${CMAKE_SOURCE_DIR}/inc)
link_directories(${CMAKE_SOURCE_DIR}/libraries)
add_executable(MarkoTweeter ${SOURCE_FILES} markov/markov_chain.cpp    
markov/markov_chain.h)
target_link_libraries(MarkoTweeter twitcurl)

但我一直收到这个错误:

[ 33%] Linking CXX executable MarkoTweeter
ld: library not found for -ltwitcurl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[3]: *** [MarkoTweeter] Error 1
make[2]: *** [CMakeFiles/MarkoTweeter.dir/all] Error 2
make[1]: *** [CMakeFiles/MarkoTweeter.dir/rule] Error 2
make: *** [MarkoTweeter] Error 2

由于某种原因,它找不到共享库。我试过使用:

g++ main.cpp libraries/libtwitcurl.so.1

效果很好。但我似乎无法在 CLion 中使用 CMake。

最佳答案

您需要将绝对路径传递给 target_link_libraries。 按照官方 documentation 中的建议,使用 find_library 而不是 link_directories :

Note that this command is rarely necessary. Library locations returned by find_package() and find_library() are absolute paths. Pass these absolute library file paths directly to the target_link_libraries() command. CMake will ensure the linker finds them.

对于您的情况,find_library 的简单用法是:

find_library(TWIT_CURL_LIBRARY twitcurl ${CMAKE_SOURCE_DIR}/libraries)
target_link_libraries(MarkoTweeter ${TWIT_CURL_LIBRARY})

关于c++ - 使用 CMake 在 macOS 中链接 .so 库时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47585043/

相关文章:

c++ - 我如何手动调用 SEL_MenuHandler

c++ - 我如何使 gtest 工作

c++ - 如果类没有默认可见性,如何使静态断言失败

c++ - 如何使用 C++ 从字符串中删除前导零?

c++ - 返回值部分且确定性地变化

c++ - 使用 CMake 从二进制文件编译和添加目标文件

针对 glibc 的 Android 静态链接与动态链接

java - 我无法打开 OMNeT++ IDE

visual-studio - CMake删除 "Full Path of Source Code File in Diagnostics"选项/FC