我正在尝试将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
的组合{1}}和-l
?
根据this question,应该通过添加cmake_policy(SET CMP0060 NEW)
来禁用此功能。但是,如果我将其设置为NEW
或OLD
,我看不到CMake行为的任何变化。
答案 0 :(得分:4)
您可能被CMP0060的OLD(默认)行为所咬,这会将绝对路径转换回-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)