【发布时间】:2016-10-23 23:48:04
【问题描述】:
我有一个安装了默认版本 Boost 的系统,并且我在/opt 下安装了另一个版本。我用:
find_package(Boost 1.54.0 QUIET REQUIRED
COMPONENTS
system program_options regex filesystem
)
这给了我${Boost_INCLUDE_DIR} 和${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
也许 IMPORTED 目标缺少 find_package() 调用,或者缺少 ALIAS 目标?
【问题讨论】:
-
Boost_LIBRARIES的内容是什么? -
@wasthishelpful:是
/opt/etc/etc/lib/libboost_system.so;/opt/etc/etc/lib/libboost_program_options.so;/opt/etc/etc/lib/libboost_regex.so;/opt/etc/etc/lib/libboost_filesystem.so -
这看起来与您的链接命令不一致。您是否尝试使用导入的目标?像
target_link_libraries(tester Boost::system ...)这样的东西。如果您想进一步解决您的问题,我很想看到您完整的 CMake 文件 -
@wasthishelpful:我以前没有听说过导入的目标,但我会尝试一下。 ...好的,试过了,失败了,见编辑。
-
很奇怪。能否请您清理缓存,重新运行 cmake,并使用完整的 CMake(或至少一个 MCVE)发布日志(如果太长,仅与 Boost 相关的消息就足够了)?