CMake (3.5.2) 使用了非绝对的提升库路径,不会 -L 我的升压目录

CMake (3.5.2) used non-absolute boost lib paths, doesn't -L my boost dir

本文关键字:路径 不会 我的 CMake      更新时间:2023-10-16

我的系统安装了默认版本的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}")