我有一个安装了默认版本Boost的系统,我在/opt
下安装了另一个版本。我用:
find_package(Boost 1.54.0 QUIET REQUIRED
COMPONENTS
system program_options regex filesystem
)
这会在/opt/etc/etc/include
和/opt/etc/etc/lib
中为${Boost_INCLUDE_DIR}
和${Boost_LIBRARY_DIRS}
提供。
我也用:
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库),它至少会{{1}适当的目录。
所以会发生的是链接器尝试使用我系统的升级库的默认版本。换句话说,链接命令如下所示:
-L
(是的,那里有冗余,但这不是问题。)
为什么会发生这种情况?
PS:我知道这不是一个MCVE,所以我要求"常见的补救措施"对于这样的问题。修改:我已尝试将target_link_libraries命令切换为:
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
即。使用导入的目标。但我明白了:
target_link_libraries(tester
Boost::system Boost::program_options
Boost::regex Boost::file_system
${CUDA_LIBRARIES} ${CUDA_cupti_LIBRARY}
nvToolsExt OpenCL cudadevrt ktkernels )
对于IMPORTED目标,或者缺少ALIAS目标,可能缺少find_package()调用?
答案 0 :(得分:0)
这(解决方法?)有效:
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}")
在CMakeLists.txt文件中。