C++ 如何将Boost库与CMake链接(如果Boost位于非标准位置,则在集群上)?

C++ 如何将Boost库与CMake链接(如果Boost位于非标准位置,则在集群上)?,c++,boost,cmake,C++,Boost,Cmake,当我试图在集群上构建一个简单的Boost测试程序时,我遇到了一个奇怪的问题。 在我的机器上,一切正常 首先是一个例子: //main.cpp #include <iostream> #include <string> #include "boost/program_options.hpp" namespace po = boost::program_options; int main( int argc , char* argv[] ) { po::option

当我试图在集群上构建一个简单的Boost测试程序时,我遇到了一个奇怪的问题。 在我的机器上,一切正常

首先是一个例子:

//main.cpp
#include <iostream>
#include <string>
#include "boost/program_options.hpp"

namespace po = boost::program_options;

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

  po::options_description desc("Allowed options");
  desc.add_options()
  ("help", "produce help message")
  ("greet", po::value<std::string>()->default_value("World"), "the greeting")
  ;

  po::variables_map vm;
  po::store(po::parse_command_line(argc, argv, desc), vm);

  std::cout << "Hello, " << vm["greet"].as<std::string>() << "!" << std::endl;
  return 0;
}
我喜欢用cmake

cmake -G "Unix Makefiles" /path/to/code
make
我得到的错误是链接过程中未定义的引用错误:

Linking CXX executable boost_test
CMakeFiles/boost_test.dir/main.cpp.o: In function `main':
main.cpp:(.text+0x6d): undefined reference to `boost::program_options::options_description::options_description(std::string const&, unsigned int, unsigned int)'
CMakeFiles/boost_test.dir/main.cpp.o: In function `boost::program_options::variables_map::operator[](std::string const&) const':
main.cpp:(.text._ZNK5boost15program_options13variables_mapixERKSs[_ZNK5boost15program_options13variables_mapixERKSs]+0x1f): undefined reference to `boost::program_options::abstract_variables_map::operator[](std::string const&) const'
等等

因此,我认为boost的安装可能不正确,于是我尝试自己编写一个makefile

boost-test-1: ../code/main.cpp
    g++ ../code/main.cpp -o boost-test-1 -lboost_program_options

boost-test-2: ../code/main.cpp
    g++ ../code/main.cpp -o boost-test-2 /some/fancy/cluster/path/certainly/non/standard/Boost/lib/libboost_program_options.so
构建程序的两种方法都可以很好地工作。但cmake所做的基本上是:首先,构建一个对象文件,然后将对象文件和库链接在一起,但失败了

boost-test-3: ../code/main.cpp
    /usr/bin/c++    -I/some/fancy/cluster/path/certainly/non/standard/Boost/include  -std=c++11   -o main.cpp.o -c ../code/main.cpp
    /usr/bin/c++    -std=c++11   main.cpp.o  -o boost-test-3 /some/fancy/cluster/path/certainly/non/standard/Boost/lib/libboost_program_options.so
如前所述,在我的计算机上,所有描述了构建程序的方法,但在集群上,cmake方法不幸失败。问题是,我有另一个更大的项目,它使用cmake,我正在寻找一种在特定集群上构建它的方法

你知道什么会导致这个问题,以及如何解决它吗? 谢谢大家!


更新:这是构建过程的全部输出。我将到cmake和boost的路径缩短为“path/to/cmake”和“path/to/boost”,以使其更短、可读性更好,但这是与上述相同的长路径

$ cmake -G "Unix Makefiles" ../code/
-- The C compiler identification is GNU 4.8.5
-- The CXX compiler identification is GNU 4.8.5
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Boost version: 1.61.0
-- Found the following Boost libraries:
--   program_options
-- Boost include directories (Boost_INCLUDE_DIRS): /path/to/Boost/include
-- Link directories for Boost libraries (Boost_LIBRARY_DIRS): /path/to/Boost/lib
-- Boost component libraries to be linked (Boost_LIBRARIES): /path/to/Boost/lib/libboost_program_options.so
-- Configuring done
-- Generating done
-- Build files have been written to: /home/test/build

$ make VERBOSE=1
/path/to/CMake/bin/cmake -H/home/test/code -B/home/test/build --check-build-system CMakeFiles/Makefile.cmake 0
/path/to/CMake/bin/cmake -E cmake_progress_start /home/test/build/CMakeFiles /home/test/build/CMakeFiles/progress.marks
make -f CMakeFiles/Makefile2 all
make[1]: Entering directory `/home/test/build'
make -f CMakeFiles/boost_test.dir/build.make CMakeFiles/boost_test.dir/depend
make[2]: Entering directory `/home/test/build'
cd /home/test/build && /path/to/CMake/bin/cmake -E cmake_depends "Unix Makefiles" /home/test/code /home/test/code /home/test/build /home/test/build /home/test/build/CMakeFiles/boost_test.dir/DependInfo.cmake --color=
Dependee "/home/test/build/CMakeFiles/boost_test.dir/DependInfo.cmake" is newer than depender "/home/test/build/CMakeFiles/boost_test.dir/depend.internal".
Dependee "/home/test/build/CMakeFiles/CMakeDirectoryInformation.cmake" is newer than depender "/home/test/build/CMakeFiles/boost_test.dir/depend.internal".
Scanning dependencies of target boost_test
make[2]: Leaving directory `/home/test/build'
make -f CMakeFiles/boost_test.dir/build.make CMakeFiles/boost_test.dir/build
make[2]: Entering directory `/home/test/build'
[ 50%] Building CXX object CMakeFiles/boost_test.dir/main.cpp.o
/usr/bin/c++    -I/path/to/Boost/include  -std=c++11   -o CMakeFiles/boost_test.dir/main.cpp.o -c /home/test/code/main.cpp
[100%] Linking CXX executable boost_test
/path/to/CMake/bin/cmake -E cmake_link_script CMakeFiles/boost_test.dir/link.txt --verbose=1
/usr/bin/c++    -std=c++11   CMakeFiles/boost_test.dir/main.cpp.o  -o boost_test /path/to/Boost/lib/libboost_program_options.so 
CMakeFiles/boost_test.dir/main.cpp.o: In function `main':
main.cpp:(.text+0x6d): undefined reference to `boost::program_options::options_description::options_description(std::string const&, unsigned int, unsigned int)'
CMakeFiles/boost_test.dir/main.cpp.o: In function `boost::program_options::variables_map::operator[](std::string const&) const':
main.cpp:(.text._ZNK5boost15program_options13variables_mapixERKSs[_ZNK5boost15program_options13variables_mapixERKSs]+0x1f): undefined reference to `boost::program_options::abstract_variables_map::operator[](std::string const&) const'
CMakeFiles/boost_test.dir/main.cpp.o: In function `boost::program_options::basic_command_line_parser<char>::basic_command_line_parser(int, char const* const*)':
main.cpp:(.text._ZN5boost15program_options25basic_command_line_parserIcEC2EiPKPKc[_ZN5boost15program_options25basic_command_line_parserIcEC5EiPKPKc]+0x76): undefined reference to `boost::program_options::detail::cmdline::cmdline(std::vector<std::string, std::allocator<std::string> > const&)'
CMakeFiles/boost_test.dir/main.cpp.o: In function `boost::program_options::basic_command_line_parser<char>::extra_parser(boost::function1<std::pair<std::string, std::string>, std::string const&>)':
main.cpp:(.text._ZN5boost15program_options25basic_command_line_parserIcE12extra_parserENS_9function1ISt4pairISsSsERKSsEE[_ZN5boost15program_options25basic_command_line_parserIcE12extra_parserENS_9function1ISt4pairISsSsERKSsEE]+0x33): undefined reference to `boost::program_options::detail::cmdline::set_additional_parser(boost::function1<std::pair<std::string, std::string>, std::string const&>)'
CMakeFiles/boost_test.dir/main.cpp.o: In function `std::vector<std::string, std::allocator<std::string> > boost::program_options::to_internal<std::string>(std::vector<std::string, std::allocator<std::string> > const&)':
main.cpp:(.text._ZN5boost15program_options11to_internalISsEESt6vectorISsSaISsEERKS2_IT_SaIS5_EE[_ZN5boost15program_options11to_internalISsEESt6vectorISsSaISsEERKS2_IT_SaIS5_EE]+0x46): undefined reference to `boost::program_options::to_internal(std::string const&)'
CMakeFiles/boost_test.dir/main.cpp.o:(.rodata._ZTVN5boost15program_options11typed_valueISscEE[_ZTVN5boost15program_options11typed_valueISscEE]+0x40): undefined reference to `boost::program_options::value_semantic_codecvt_helper<char>::parse(boost::any&, std::vector<std::string, std::allocator<std::string> > const&, bool) const'
CMakeFiles/boost_test.dir/main.cpp.o: In function `boost::program_options::typed_value<std::string, char>::name() const':
main.cpp:(.text._ZNK5boost15program_options11typed_valueISscE4nameEv[_ZNK5boost15program_options11typed_valueISscE4nameEv]+0x32): undefined reference to `boost::program_options::arg'
CMakeFiles/boost_test.dir/main.cpp.o: In function `boost::program_options::typed_value<std::string, char>::xparse(boost::any&, std::vector<std::string, std::allocator<std::string> > const&) const':
main.cpp:(.text._ZNK5boost15program_options11typed_valueISscE6xparseERNS_3anyERKSt6vectorISsSaISsEE[_ZNK5boost15program_options11typed_valueISscE6xparseERNS_3anyERKSt6vectorISsSaISsEE]+0x7a): undefined reference to `boost::program_options::validate(boost::any&, std::vector<std::string, std::allocator<std::string> > const&, std::string*, int)'
collect2: error: ld returned 1 exit status
make[2]: *** [boost_test] Error 1
make[2]: Leaving directory `/home/test/build'
make[1]: *** [CMakeFiles/boost_test.dir/all] Error 2
make[1]: Leaving directory `/home/test/build'
make: *** [all] Error 2
$cmake-G“Unix生成文件”。/code/
--C编译器标识为GNU4.8.5
--CXX编译器标识为GNU 4.8.5
--检查C编译器是否工作:/usr/bin/cc
--检查C编译器是否工作:/usr/bin/cc--works
--检测C编译器ABI信息
--检测C编译器ABI信息-完成
--检测C编译特性
--检测C编译特性-完成
--检查CXX编译器是否工作:/usr/bin/c++
--检查CXX编译器是否正常工作:/usr/bin/c++--正常工作
--检测CXX编译器ABI信息
--检测CXX编译器ABI信息-完成
--检测CXX编译特性
--检测CXX编译功能-完成
--Boost版本:1.61.0
--找到以下Boost库:
--程序选项
--Boost包含目录(Boost\u include\u DIRS):/path/to/Boost/include
--Boost库的链接目录(Boost\u LIBRARY\u DIRS):/path/to/Boost/lib
--要链接的Boost组件库(Boost_库):/path/to/Boost/lib/libboost_program_options.so
--配置完成
--生成完成
--生成文件已写入:/home/test/Build
$make VERBOSE=1
/路径/to/CMake/bin/CMake-H/home/test/code-B/home/test/build——检查生成系统CMakeFiles/Makefile.CMake 0
/路径/to/CMake/bin/CMake-E CMake_progress_start/home/test/build/CMakeFiles/home/test/build/CMakeFiles/progress.marks
make-f cmakfiles/Makefile2全部
make[1]:输入目录“/home/test/build”
make-f CMakeFiles/boost\u test.dir/build.make CMakeFiles/boost\u test.dir/depend
make[2]:输入目录“/home/test/build”
cd/home/test/build&/path/to/CMake/bin/CMake-E CMake_依赖于“Unix Makefiles”/home/test/code/home/test/build/home/test/build/build/CMakeFiles/boost_test.dir/DependInfo.CMake--color=
Dependee“/home/test/build/CMakeFiles/boost_test.dir/DependInfo.cmake”比depender“/home/test/build/CMakeFiles/boost_test.dir/depend.internal”更新。
Dependee“/home/test/build/CMakeFiles/cmakeditoryinformation.cmake”比depender“/home/test/build/CMakeFiles/boost\u test.dir/depend.internal”更新。
目标boost_测试的扫描相关性
make[2]:离开目录“/home/test/build”
make-f CMakeFiles/boost\u test.dir/build.make CMakeFiles/boost\u test.dir/build
make[2]:输入目录“/home/test/build”
[50%]构建CXX对象CMakeFiles/boost_test.dir/main.cpp.o
/usr/bin/c++-I/path/to/Boost/include-std=c++11-ocmakefiles/Boost_test.dir/main.cpp.o-c/home/test/code/main.cpp
[100%]链接CXX可执行boost_测试
/path/to/CMake/bin/CMake-E CMake_link_脚本CMakeFiles/boost_test.dir/link.txt--verbose=1
/usr/bin/c++-std=c++11 cmakfiles/boost_test.dir/main.cpp.o-o boost_test/path/to/boost/lib/libboost_program_options.so
CMakeFiles/boost_test.dir/main.cpp.o:在函数“main”中:
main.cpp:(.text+0x6d):对“boost::program\u options::options\u description::options\u description(std::string const&,unsigned int,unsigned int)”的未定义引用
CMakeFiles/boost_test.dir/main.cpp.o:在函数'boost::program_options::variables_map::operator[](std::string const&)const'中:
main.cpp:(.text.znk5boost15程序选项13变量映射器[znk5boost15程序选项13变量映射器]+0x1f):对` boost::program\u options::abstract\u variables\u map::operator[](std::string const&)const'的未定义引用
CMakeFiles/boost_test.dir/main.cpp.o:在函数“boost::program_options::basic_command_line_parser::basic_command_line_parser(int,char const*const*)”中:
main.cpp:(.text.ZN5boost15program_options 25basic_command_line_parsericec2eipkkc[ZN5boost15program_options 25basic_command_line_parserIcEC5EiPKPKc]+0x76):对“boost::program_options::detail::cmdline::cmdline(std::vector const&)”的未定义引用
CMakeFiles/boost_test.dir/main.cpp.o:在函数“boost::program_options::basic_命令行_parser::extra_parser(boost::function1)”中:
main.cpp:(.text.\zn5boost15程序选项25basic命令行解析指令12extra\u parserENS函数1ist4pairissserksee[\uzn5boost15程序选项25basic命令行解析指令12extra\u parserENS函数1ist4pairissserksee]+0x33):对“boost::program\u选项::detail::cmdline::set\u附加解析器(boost::function1)”的未定义引用
CMakeFiles/boost_test.dir/main.cpp.o:在函数“std::vector boost::program_options::to_internal(std::vector const&)”中:
main.cpp:(.text."boost15程序"选项11到"内部是seest6矢量saiserks2到"IT"saiserks2到"EE["zn5 boost15程序"选项11到"内部是seest6矢量saiserks2到"IT"EE]+0x46):对` boost::program(选项)到"内部(std::string const&)的未定义引用
CMakeFiles/boost_test.dir/main.cpp.o:(.rodata.\u ztvn5boost15程序选项11类型化值设置[\u ztvn5boost15程序选项11类型化值设置]+0
$ cmake -G "Unix Makefiles" ../code/
-- The C compiler identification is GNU 4.8.5
-- The CXX compiler identification is GNU 4.8.5
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Boost version: 1.61.0
-- Found the following Boost libraries:
--   program_options
-- Boost include directories (Boost_INCLUDE_DIRS): /path/to/Boost/include
-- Link directories for Boost libraries (Boost_LIBRARY_DIRS): /path/to/Boost/lib
-- Boost component libraries to be linked (Boost_LIBRARIES): /path/to/Boost/lib/libboost_program_options.so
-- Configuring done
-- Generating done
-- Build files have been written to: /home/test/build

$ make VERBOSE=1
/path/to/CMake/bin/cmake -H/home/test/code -B/home/test/build --check-build-system CMakeFiles/Makefile.cmake 0
/path/to/CMake/bin/cmake -E cmake_progress_start /home/test/build/CMakeFiles /home/test/build/CMakeFiles/progress.marks
make -f CMakeFiles/Makefile2 all
make[1]: Entering directory `/home/test/build'
make -f CMakeFiles/boost_test.dir/build.make CMakeFiles/boost_test.dir/depend
make[2]: Entering directory `/home/test/build'
cd /home/test/build && /path/to/CMake/bin/cmake -E cmake_depends "Unix Makefiles" /home/test/code /home/test/code /home/test/build /home/test/build /home/test/build/CMakeFiles/boost_test.dir/DependInfo.cmake --color=
Dependee "/home/test/build/CMakeFiles/boost_test.dir/DependInfo.cmake" is newer than depender "/home/test/build/CMakeFiles/boost_test.dir/depend.internal".
Dependee "/home/test/build/CMakeFiles/CMakeDirectoryInformation.cmake" is newer than depender "/home/test/build/CMakeFiles/boost_test.dir/depend.internal".
Scanning dependencies of target boost_test
make[2]: Leaving directory `/home/test/build'
make -f CMakeFiles/boost_test.dir/build.make CMakeFiles/boost_test.dir/build
make[2]: Entering directory `/home/test/build'
[ 50%] Building CXX object CMakeFiles/boost_test.dir/main.cpp.o
/usr/bin/c++    -I/path/to/Boost/include  -std=c++11   -o CMakeFiles/boost_test.dir/main.cpp.o -c /home/test/code/main.cpp
[100%] Linking CXX executable boost_test
/path/to/CMake/bin/cmake -E cmake_link_script CMakeFiles/boost_test.dir/link.txt --verbose=1
/usr/bin/c++    -std=c++11   CMakeFiles/boost_test.dir/main.cpp.o  -o boost_test /path/to/Boost/lib/libboost_program_options.so 
CMakeFiles/boost_test.dir/main.cpp.o: In function `main':
main.cpp:(.text+0x6d): undefined reference to `boost::program_options::options_description::options_description(std::string const&, unsigned int, unsigned int)'
CMakeFiles/boost_test.dir/main.cpp.o: In function `boost::program_options::variables_map::operator[](std::string const&) const':
main.cpp:(.text._ZNK5boost15program_options13variables_mapixERKSs[_ZNK5boost15program_options13variables_mapixERKSs]+0x1f): undefined reference to `boost::program_options::abstract_variables_map::operator[](std::string const&) const'
CMakeFiles/boost_test.dir/main.cpp.o: In function `boost::program_options::basic_command_line_parser<char>::basic_command_line_parser(int, char const* const*)':
main.cpp:(.text._ZN5boost15program_options25basic_command_line_parserIcEC2EiPKPKc[_ZN5boost15program_options25basic_command_line_parserIcEC5EiPKPKc]+0x76): undefined reference to `boost::program_options::detail::cmdline::cmdline(std::vector<std::string, std::allocator<std::string> > const&)'
CMakeFiles/boost_test.dir/main.cpp.o: In function `boost::program_options::basic_command_line_parser<char>::extra_parser(boost::function1<std::pair<std::string, std::string>, std::string const&>)':
main.cpp:(.text._ZN5boost15program_options25basic_command_line_parserIcE12extra_parserENS_9function1ISt4pairISsSsERKSsEE[_ZN5boost15program_options25basic_command_line_parserIcE12extra_parserENS_9function1ISt4pairISsSsERKSsEE]+0x33): undefined reference to `boost::program_options::detail::cmdline::set_additional_parser(boost::function1<std::pair<std::string, std::string>, std::string const&>)'
CMakeFiles/boost_test.dir/main.cpp.o: In function `std::vector<std::string, std::allocator<std::string> > boost::program_options::to_internal<std::string>(std::vector<std::string, std::allocator<std::string> > const&)':
main.cpp:(.text._ZN5boost15program_options11to_internalISsEESt6vectorISsSaISsEERKS2_IT_SaIS5_EE[_ZN5boost15program_options11to_internalISsEESt6vectorISsSaISsEERKS2_IT_SaIS5_EE]+0x46): undefined reference to `boost::program_options::to_internal(std::string const&)'
CMakeFiles/boost_test.dir/main.cpp.o:(.rodata._ZTVN5boost15program_options11typed_valueISscEE[_ZTVN5boost15program_options11typed_valueISscEE]+0x40): undefined reference to `boost::program_options::value_semantic_codecvt_helper<char>::parse(boost::any&, std::vector<std::string, std::allocator<std::string> > const&, bool) const'
CMakeFiles/boost_test.dir/main.cpp.o: In function `boost::program_options::typed_value<std::string, char>::name() const':
main.cpp:(.text._ZNK5boost15program_options11typed_valueISscE4nameEv[_ZNK5boost15program_options11typed_valueISscE4nameEv]+0x32): undefined reference to `boost::program_options::arg'
CMakeFiles/boost_test.dir/main.cpp.o: In function `boost::program_options::typed_value<std::string, char>::xparse(boost::any&, std::vector<std::string, std::allocator<std::string> > const&) const':
main.cpp:(.text._ZNK5boost15program_options11typed_valueISscE6xparseERNS_3anyERKSt6vectorISsSaISsEE[_ZNK5boost15program_options11typed_valueISscE6xparseERNS_3anyERKSt6vectorISsSaISsEE]+0x7a): undefined reference to `boost::program_options::validate(boost::any&, std::vector<std::string, std::allocator<std::string> > const&, std::string*, int)'
collect2: error: ld returned 1 exit status
make[2]: *** [boost_test] Error 1
make[2]: Leaving directory `/home/test/build'
make[1]: *** [CMakeFiles/boost_test.dir/all] Error 2
make[1]: Leaving directory `/home/test/build'
make: *** [all] Error 2