【问题标题】:CMake (3.5.2) used non-absolute boost lib paths, doesn't -L my boost dirCMake (3.5.2) 使用了非绝对的 boost lib 路径,不是 -L my boost dir
【发布时间】: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 相关的消息就足够了)?

标签: c++ boost linker cmake


【解决方案1】:

这个(解决方法?)有效:

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 文件中。

【讨论】:

  • link_directories("${Boost_LIBRARY_DIRS}") 应该是等价的,但你不应该使用它
  • @wasthishelpful:不。不幸的是,它不等效。使用我的解决方法,链接命令是-L/opt/etc/etc/lib;使用您的 link_directories 命令 - 它没有(但它确实有更多的空格,但我希望 -L 出现)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
  • 2014-10-30
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多