c++ - CMake FIND_PACKAGE 成功但返回错误的路径

标签 c++ boost cmake

我正在尝试使用我的 CMakeLists.txt 中的以下代码将 CMake 2.8.6 链接到 boost::program_options

FIND_PACKAGE(Boost COMPONENTS program_options REQUIRED)
INCLUDE_DIRECTORIES (${Boost_INCLUDE_DIR})

ADD_EXECUTABLE (segment segment.cpp)
TARGET_LINK_LIBRARIES (segment ${Boost_LIBRARIES})

find 命令似乎成功,但将错误的目录传递给链接器。包实际上在:

`/usr/lib64/libboost_program_options-mt.so.5`

CMakeFiles/segment.dir/link.txt 列出以下内容:

/cm/shared/apps/gcc/4.4.6/bin/c++       CMakeFiles/segment.dir/segment.cpp.o  -o segment -rdynamic /usr/lib64/lib64/libboost_program_options-mt.so.5 -lpthread -lrt -Wl,-rpath,/usr/lib64/lib64

注意路径中额外的 lib64。此外,路径前面的 -l 标志似乎丢失了。

当运行 CMake 时,它​​报告它正确找到了包,并且 {$Boost_LIBRARIES} 变量似乎列出了正确的库:

Boost  found.
Found Boost components:
   program_options
${Boost_LIBRARIES} - optimized;boost_program_options-mt-shared;debug;boost_program_options-mt-shared-debug

生成的 CMakeCache.txt 文件开头为:

//The directory containing a CMake configuration file for Boost.
Boost_DIR:PATH=/usr/lib64/boost

//Boost include directory
Boost_INCLUDE_DIR:FILEPATH=/usr/include

这似乎是正确的。但是当运行 make 它使用上面 link.txt 中的路径时,我得到了错误:

make[2]: *** No rule to make target `/usr/lib64/lib64/libboost_program_options-mt.so.5', needed by `segment'.  Stop.
make[1]: *** [CMakeFiles/segment.dir/all] Error 2
make: *** [all] Error 2

什么可能导致将子目录额外注入(inject)到路径中?什么可能导致以这种方式生成 link.txt?我该如何修复它(或解决它)?

最佳答案

当使用带有 cmake-2.8.6-rc2 或更高版本的某些旧版本的 boost 时会出现此问题,其中 boost 包查找代码已更改。

可以通过在 cmake 命令行中指定 -DBoost_NO_BOOST_CMAKE=ON 来解决此问题。

实际引入这个问题的commit是7da796d1fdd7cca07df733d010cd343f6f8787a9,可以是viewed here .

关于c++ - CMake FIND_PACKAGE 成功但返回错误的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9948375/

相关文章:

c++ - 定时发送和接收同一数据包

c++ - 执行循环直到系统时间到达特定日期/时间

c++ - 为 Code::Blocks 安装 FLTK

ubuntu - CMake 在简单的测试程序上失败

c++ - QThread 将结果数据传递给 MainThread

c++ - 哪个版本的 GCC 引入了对原子内置函数的支持?

c++ - 用于构建 C++ Google Protocol Buffers 项目的 Makefile

c++ - 如何为 msvc9.0 而不是 msvc10.0 构建 boost ?

c++ - 交叉编译时CMake GTest fatal error (缺少stdlib.h)

c++ - C++ 中的线程安全单例使用静态成员实例(无惰性实例化)