CMake (3.5.2) 使用了非绝对的提升库路径,不会 -L 我的升压目录
CMake (3.5.2) used non-absolute boost lib paths, doesn't -L my boost dir
我的系统安装了默认版本的Boost,并且在/opt
下安装了另一个版本。我使用:
find_package(Boost 1.54.0 QUIET REQUIRED
COMPONENTS
system program_options regex filesystem
)
得到${Boost_INCLUDE_DIR}
和${Boost_LIBRARY_DIRS}
中的/opt/etc/etc/include
和/opt/etc/etc/lib
。
我也用:
target_link_libraries(tester
${Boost_LIBRARIES}
${CUDA_LIBRARIES}
${CUDA_cupti_LIBRARY}
nvToolsExt
OpenCL
cudadevrt
# more stuff here
)
(如果你想知道,这不是cuda链接的代码)
当Makefile执行时,我看到编译命令有-I/opt/etc/etc/include
。
然而,link命令不使用boost库的绝对名称,也不使用-L/opt/etc/etc/boost
-而对于其他库(CUDA库),它至少使用-L
适当的目录。
所以发生的是链接器试图使用我的系统的默认版本的boost库。换句话说,链接命令看起来像:
g++ -bunch -of -switches bunch.o of.o files.o -lboost_system
-lboost_program_options -lboost_regex -lboost_filesystem -Wl,-Bstatic
-lcudart_static -Wl,-Bdynamic -lpthread -ldl -lrt
/usr/local/cuda/extras/CUPTI/lib64/libcupti.so -lnvToolsExt -lOpenCL
-lcudadevrt lib/morestuff.a -Wl,-Bstatic -lcudart_static -Wl,-Bdynamic
-lpthread -ldl -lrt -Wl,-rpath,/usr/local/cuda/extras/CUPTI/lib64
(是的,有冗余,但这不是这里的问题。)
为什么会发生这种情况?
PS:我知道这不是一个完全的MCVE,所以我要求对这种问题的"常见补救措施"。
编辑:我已经尝试切换我的target_link_libraries命令为:
target_link_libraries(tester
Boost::system Boost::program_options
Boost::regex Boost::file_system
${CUDA_LIBRARIES} ${CUDA_cupti_LIBRARY}
nvToolsExt OpenCL cudadevrt ktkernels )
。使用导入的目标。但是我得到:
Target "tester" links to target "Boost::file_system" but the target was not found
也许find_package()调用丢失了一个导入的目标,或者一个ALIAS目标丢失了?
This (workaround?) works:
set (CMAKE_SHARED_LINKER_FLAGS ${CMAKE_SHARED_LINKER_FLAGS} "-L${Boost_LIBRARY_DIRS}")
set (CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} "-L${Boost_LIBRARY_DIRS}")
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 整数不会重复超过随机数
- 如何在 C 中正确使用 libiconv 使其不会报告"Arg list too long"?
- 'short int'持有的值溢出,但"自动"不会溢出?
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- TDateTime格式在C++Builder中不会更改
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 在循环C++中指定字符串之后,不会打印该字符串
- 终端不会为C++文件创建.exe文件吗
- SDL 窗口不会弹出
- OpenGL在启用深度测试时不会丢弃我的碎片
- flutter:即使shouldRepaint()返回true,自定义画家也不会重新绘制
- 从服务器传输到客户端的消息不会出现
- C++Brute Force攻击函数不会返回结果
- GetFullPathName 不会获取 DLL 路径
- Boost Filesystem flowly_caronical不会在没有父文件夹的情况下解决相对路径
- 安装名称工具在通过 OTOOL 查看时不会添加库的路径
- QT - 包含路径,"include"作为目录不会包含
- CMake (3.5.2) 使用了非绝对的提升库路径,不会 -L 我的升压目录
- 使用cygwin编译C++不会搜索提供的包含路径