Избегайте автоматически добавленного префикса "lib" при использовании target_link_libraries - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь связать проект C ++ с библиотекой RCpp;файл называется Rcpp.so, а не linux-default libRcpp.so.Кроме того, библиотека находится в нестандартном месте /usr/lib/R/site-library/Rcpp/libs.

Поэтому я попытался использовать комбинацию find_library и target_link_libraries:

cmake_minimum_required(VERSION 3.8)
project("R-Tests")

find_library(RCPP
    NAMES Rcpp.so
    HINTS /usr/lib/R/site-library/Rcpp/libs
)
if (NOT RCPP)
    message(FATAL_ERROR "Could not find Rcpp - exiting.")
else()
    message("Found Rcpp: " ${RCPP})
endif()

# test target
add_executable(rcpptest main.cpp)
target_link_libraries(rcpptest ${RCPP})

Конфигурирование работает отлично, CMakeвыводит:

Found Rcpp: /usr/lib/R/site-library/Rcpp/libs/Rcpp.so

Однако во время сборки CMake передает компилятору -lRcpp, что приводит к сбою компиляции, поскольку файл библиотеки не называется libRcpp.so, а вместо Rcpp.so:

[100%] Linking CXX executable rcpptest
/usr/bin/cmake -E cmake_link_script CMakeFiles/rcpptest.dir/link.txt --verbose=1
c++     CMakeFiles/rcpptest.dir/main.cpp.o  -o rcpptest  -L/usr/lib/R/site-library/Rcpp/libs -Wl,-rpath,/usr/lib/R/site-library/Rcpp/libs -lRcpp
/usr/bin/ld: cannot find -lRcpp
collect2: error: ld returned 1 exit status

Так как в строке message печатается полный путь к файлу Rcpp.so, есть ли способ разрешить target_link_libraries просто добавить этот путь в компилятор вместо комбинации -Lи -l?

Согласно этот вопрос , его следует отключить, добавив cmake_policy(SET CMP0060 NEW);Тем не менее, я не вижу никаких изменений в поведении CMake, если я установлю это NEW или OLD.

1 Ответ

0 голосов
/ 15 мая 2018

Возможно, вас укусило старое (по умолчанию) поведение CMP0060 , которое преобразует абсолютные пути обратно в -lfoo.

В качестве альтернативы, определите и используйте цель IMPORTED:

add_library(Rcpp SHARED IMPORTED)
set_property(TARGET Rcpp PROPERTY IMPORTED_LOCATION /usr/lib/R/site-library/Rcpp/libs/Rcpp.so)
target_link_libraries(rcpptest Rcpp)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...