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

时间:2017-12-01 00:52:59

标签: 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

哪个工作正常。但我似乎无法在CION中使用CMake。

1 个答案:

答案 0 :(得分:1)

您需要将绝对路径传递给target_link_libraries。 根据官方documentation

中的建议,使用find_library代替link_directories
  

请注意,此命令很少需要。 find_package()和find_library()返回的库位置是绝对路径。将这些绝对库文件路径直接传递给target_link_libraries()命令。 CMake将确保链接器找到它们。

对您的案例简单使用find_library将是:

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