我正在努力解决在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。
答案 0 :(得分:3)
您没有正确设置提示路径。
此模块从变量中读取有关搜索位置的提示:
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_INCLUDEDIR
和BOOST_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搜索的结果。在他的回答中阅读更多相关内容。