使用cmake 2.8.8链接boost库

时间:2014-06-18 01:40:38

标签: c++ boost centos cmake

我正在努力解决在stackoverflow上搜索的cmake-baed boost链接问题,以及其他论坛但无济于事。

我正在安装Boost的集群上编译C ++程序套件(取决于不同的库,除了Boost)(我知道完整路径)。在编译时使用cmake获得与boost相关的奇怪链接错误之后,我想到了首先编译一个非常简单的boost-cmake示例来解决问题。

代码如下。

#include <boost/program_options/options_description.hpp>
#include <boost/program_options/option.hpp>
using namespace std;
#include <iostream>

namespace po = boost::program_options;

int main(int argc, char** argv) {

po::options_description desc("Allowed options");
desc.add_options()
    ("help", "produce help message")
    ;

return 0;
}

我使用以下CMakeLists.txt文件进行构建。

cmake_minimum_required(VERSION 2.8)
set(Boost_INCLUDE_DIR /software/apps/boost/1.55.0/build06/include) 
set(Boost_LIBRARY_DIR /software/apps/boost/1.55.0/build06/lib)

find_package(Boost COMPONENTS program_options REQUIRED)
include_directories(${Boost_INCLUDE_DIR})
link_directories(${Boost_LIBRARY_DIR})

message("Boost include dir is ${Boost_INCLUDE_DIR}")
message("Boost library dir is ${Boost_LIBRARY_DIR}")
message("Boost libraries are at ${Boost_LIBRARIES}")

add_executable(main main.cpp)
target_link_libraries( main ${Boost_LIBRARIES} )

当我使用cmake编译时,我得到以下输出

    x_ikrul@ikramu build]$  emacs ../CMakeLists.txt
Display localhost:39.0 unavailable, simulating -nw
[x_ikrul@triolith1 build]$ rm -rf *
[x_ikrul@triolith1 build]$ cmake ..
-- The C compiler identification is GNU 4.7.2
-- The CXX compiler identification is GNU 4.7.2
-- Check for working C compiler: /software/apps/comp_wrapper/gnu/gcc
-- Check for working C compiler: /software/apps/comp_wrapper/gnu/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /software/apps/comp_wrapper/gnu/c++
-- Check for working CXX compiler: /software/apps/comp_wrapper/gnu/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
Boost  found.
Found Boost components:
program_options
Boost include dir is /usr/include
Boost library dir is /software/apps/boost/1.55.0/build06/lib
Boost libraries are at optimized;boost_program_options-mt-shared;debug;boost_program_options-mt-shared-debug
-- Configuring done
-- Generating done
-- Build files have been written to: /home/x_ikrul/Downloads/boost_example/build

问题出现在我“制作”下面给出的代码时。

    x_ikrul@ikramu build]$make 
Scanning dependencies of target main
[100%] Building CXX object CMakeFiles/main.dir/main.cpp.o
make[2]: *** No rule to make target `/usr/lib64/lib64/libboost_program_options-mt.so.5', needed by `main'.  Stop.
make[1]: *** [CMakeFiles/main.dir/all] Error 2
make: *** [all] Error 2

正如您所看到的,虽然CMake将boost目录显示为/software/apps/boost/1.55​​.0/build06/lib,但奇怪的是在链接时,它指的是一个不同的非现存目录。 / p>

有人遇到这样的错误吗?集群正在运行CentOS 6.5版本,升级(我指向的地方)是1.55.0,而我使用的cmake是2.8.8。

2 个答案:

答案 0 :(得分:3)

您没有正确设置提示路径。

来自FindBoost module docs

  

此模块从变量中读取有关搜索位置的提示:

     

BOOST_ROOT - 首选安装前缀     (或BOOSTROOT)

     

BOOST_INCLUDEDIR - 首选包含目录,例如<prefix>/include

     

BOOST_LIBRARYDIR - 首选图书馆目录,例如<prefix>/lib

     

Boost_NO_SYSTEM_PATHS - 设置为ON以禁用在不在的位置进行搜索                            由这些提示变量指定。默认值为OFF

     

...

     

并将搜索结果永久保存在CMake缓存条目中:

     

Boost_INCLUDE_DIR - 包含Boost标头的目录

     

Boost_LIBRARY_DIR - 包含Boost库的目录

所以,你的行:

set(Boost_INCLUDE_DIR /software/apps/boost/1.55.0/build06/include) 
set(Boost_LIBRARY_DIR /software/apps/boost/1.55.0/build06/lib)

实际上并未设置提示变量 - 您希望设置BOOST_INCLUDEDIRBOOST_LIBRARYDIR;也可能是Boost_NO_SYSTEM_PATHS

最好不要在CMakeLists.txt中进行硬编码,因为它不可移植。而是在调用CMake时在命令行上传递这些:

cmake . -DBOOST_INCLUDEDIR=/software/apps/boost/1.55.0/build06/include -DBOOST_LIBRARYDIR=/software/apps/boost/1.55.0/build06/lib -DBoost_NO_SYSTEM_PATHS=ON

如果将Boost_DEBUG设置为ON,您还可以更好地了解正在发生的事情。

顺便说一句,您不应该进行link_directories调用,因为在target_link_libraries调用中传递了Boost库的完整路径。

答案 1 :(得分:1)

stackoverflow answer建议在cmake命令行上添加-DBoost_NO_BOOST_CMAKE=ON

这似乎是由于某些CMake版本与某些Boost版本不兼容而导致的。

我同意Fraser所说的用户。这些行没有意义

set(Boost_INCLUDE_DIR /software/apps/boost/1.55.0/build06/include) 
set(Boost_LIBRARY_DIR /software/apps/boost/1.55.0/build06/lib)

因为CMake使用这些变量来存储Boost搜索的结果。在他的回答中阅读更多相关内容。