Ошибка при связывании библиотеки.so в macOS с использованием CMake

Я пытаюсь связать.so файл с именем libtwitcurl.so.1, используя CMake. Мой файл 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

Который работает отлично. Но я не могу заставить его работать с CMake в CLion.

1 ответ

Решение

Вам нужно пройти абсолютный путь к target_link_libraries, использование 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})
Другие вопросы по тегам