c++ - 使用 target_link_libraries 时避免自动添加“lib”前缀
问题描述
我正在尝试将 C++ 项目链接到 RCpp 库;该文件被称为Rcpp.so
,而不是 linux-default libRcpp.so
。此外,该库位于非标准位置/usr/lib/R/site-library/Rcpp/libs
。
所以我尝试使用find_library
and的组合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)
;NEW
但是,如果我将其设置为或,我看不到 CMake 的行为有任何变化OLD
。
解决方案
您可能已经被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)
推荐阅读
- python - 熊猫按日期滚动平均值?
- c++ - 输入后不执行在排序矩阵中搜索整数的代码
- r - 将单独的数据收集到 R 中的单个对象中
- python-3.x - 为什么我不能将带有数字的字符串转换为整数?
- tensorflow - ImportError:当我将 tensorflow_addons 导入为 tfa 时,无法从“tensorflow.python.keras.engine”导入名称“keras_tensor”
- android - 网络浏览器中的亚马逊支付不会重定向到我的应用程序
- mongodb - 如何获取 MongoDB 的所有集合?
- datetime - 小时日期时间格式的日期差异 - Mulesoft
- javascript - js切换检查/取消检查而不触发事件
- python - 如何检查 python 脚本是否仍在从另一个 python 脚本运行