2017-10-09 404 views
1

我在链接-lboost_program_options时遇到问题。我甚至不能编译最小示例first.cppBoost Program Options链接错误

这里是CPP:

// Copyright Vladimir Prus 2002-2004. 
// Distributed under the Boost Software License, Version 1.0. 
// (See accompanying file LICENSE_1_0.txt 
// or copy at http://www.boost.org/LICENSE_1_0.txt) 

/* The simplest usage of the library. 
*/ 

#include <boost/program_options.hpp> 
namespace po = boost::program_options; 

#include <iostream> 
#include <iterator> 
using namespace std; 

int main(int ac, char* av[]) 
{ 
    try { 

     po::options_description desc("Allowed options"); 
     desc.add_options() 
      ("help", "produce help message") 
      ("compression", po::value<double>(), "set compression level") 
     ; 

     po::variables_map vm;  
     po::store(po::parse_command_line(ac, av, desc), vm); 
     po::notify(vm);  

     if (vm.count("help")) { 
      cout << desc << "\n"; 
      return 0; 
     } 

     if (vm.count("compression")) { 
      cout << "Compression level was set to " 
       << vm["compression"].as<double>() << ".\n"; 
     } else { 
      cout << "Compression level was not set.\n"; 
     } 
    } 
    catch(exception& e) { 
     cerr << "error: " << e.what() << "\n"; 
     return 1; 
    } 
    catch(...) { 
     cerr << "Exception of unknown type!\n"; 
    } 

    return 0; 
} 

这里是我的输出:

g++ -o first first.cpp -lboost_program_options 
    /tmp/ccNDtU66.o: In function `main': 
    first.cpp:(.text+0x6f): undefined reference to `boost::program_options::options_description::options_description(std::string const&, unsigned int, unsigned int)' 
    /tmp/ccNDtU66.o: In function `boost::program_options::validation_error::validation_error(boost::program_options::validation_error::kind_t, std::string const&, std::string const&, int)': 
    first.cpp:(.text._ZN5boost15program_options16validation_errorC2ENS1_6kind_tERKSsS4_i[_ZN5boost15program_options16validation_errorC5ENS1_6kind_tERKSsS4_i]+0x2e): undefined reference to `boost::program_options::validation_error::get_template(boost::program_options::validation_error::kind_t)' 
    first.cpp:(.text._ZN5boost15program_options16validation_errorC2ENS1_6kind_tERKSsS4_i[_ZN5boost15program_options16validation_errorC5ENS1_6kind_tERKSsS4_i]+0x4c): undefined reference to `boost::program_options::error_with_option_name::error_with_option_name(std::string const&, std::string const&, std::string const&, int)' 
    /tmp/ccNDtU66.o: In function `boost::program_options::variables_map::operator[](std::string const&) const': 
    first.cpp:(.text._ZNK5boost15program_options13variables_mapixERKSs[_ZNK5boost15program_options13variables_mapixERKSs]+0x1f): undefined reference to `boost::program_options::abstract_variables_map::operator[](std::string const&) const' 
    /tmp/ccNDtU66.o: In function `boost::program_options::basic_command_line_parser<char>::basic_command_line_parser(int, char const* const*)': 
    first.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&)' 
    /tmp/ccNDtU66.o: In function `boost::program_options::basic_command_line_parser<char>::extra_parser(boost::function1<std::pair<std::string, std::string>, std::string const&>)': 
    first.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&>)' 
    /tmp/ccNDtU66.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&)': 
    first.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&)' 
    /tmp/ccNDtU66.o:(.rodata._ZTVN5boost15program_options11typed_valueIdcEE[_ZTVN5boost15program_options11typed_valueIdcEE]+0x38): 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' 
    /tmp/ccNDtU66.o:(.rodata._ZTVN5boost15program_options20invalid_option_valueE[_ZTVN5boost15program_options20invalid_option_valueE]+0x30): undefined reference to `boost::program_options::error_with_option_name::substitute_placeholders(std::string const&) const' 
    /tmp/ccNDtU66.o:(.rodata._ZTVN5boost15program_options16validation_errorE[_ZTVN5boost15program_options16validation_errorE]+0x30): undefined reference to `boost::program_options::error_with_option_name::substitute_placeholders(std::string const&) const' 
    /tmp/ccNDtU66.o: In function `boost::program_options::typed_value<double, char>::name() const': 
    first.cpp:(.text._ZNK5boost15program_options11typed_valueIdcE4nameEv[_ZNK5boost15program_options11typed_valueIdcE4nameEv]+0x26): undefined reference to `boost::program_options::arg' 
    /tmp/ccNDtU66.o: In function `void boost::program_options::validate<double, char>(boost::any&, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, double*, long)': 
    first.cpp:(.text._ZN5boost15program_options8validateIdcEEvRNS_3anyERKSt6vectorISbIT0_St11char_traitsIS5_ESaIS5_EESaIS9_EEPT_l[_ZN5boost15program_options8validateIdcEEvRNS_3anyERKSt6vectorISbIT0_St11char_traitsIS5_ESaIS5_EESaIS9_EEPT_l]+0x128): undefined reference to `boost::program_options::invalid_option_value::invalid_option_value(std::string const&)' 
    /tmp/ccNDtU66.o:(.rodata._ZTVN5boost16exception_detail10clone_implINS0_19error_info_injectorINS_15program_options16validation_errorEEEEE[_ZTVN5boost16exception_detail10clone_implINS0_19error_info_injectorINS_15program_options16validation_errorEEEEE]+0x38): undefined reference to `boost::program_options::error_with_option_name::substitute_placeholders(std::string const&) const' 
    /tmp/ccNDtU66.o:(.rodata._ZTVN5boost16exception_detail19error_info_injectorINS_15program_options16validation_errorEEE[_ZTVN5boost16exception_detail19error_info_injectorINS_15program_options16validation_errorEEE]+0x30): undefined reference to `boost::program_options::error_with_option_name::substitute_placeholders(std::string const&) const' 
    /tmp/ccNDtU66.o:(.rodata._ZTVN5boost16exception_detail10clone_implINS0_19error_info_injectorINS_15program_options20invalid_option_valueEEEEE[_ZTVN5boost16exception_detail10clone_implINS0_19error_info_injectorINS_15program_options20invalid_option_valueEEEEE]+0x38): undefined reference to `boost::program_options::error_with_option_name::substitute_placeholders(std::string const&) const' 
    /tmp/ccNDtU66.o:(.rodata._ZTVN5boost16exception_detail19error_info_injectorINS_15program_options20invalid_option_valueEEE[_ZTVN5boost16exception_detail19error_info_injectorINS_15program_options20invalid_option_valueEEE]+0x30): undefined reference to `boost::program_options::error_with_option_name::substitute_placeholders(std::string const&) const' 
    collect2: error: ld returned 1 exit status 
    Makefile:4: recipe for target 'first' failed 
    make: *** [first] Error 1 

我该如何解决这个问题?

我使用Ubuntu 16.04,英特尔(R)酷睿(TM)i5-6400 CPU @ 2.70GHz

+0

'http:// coliru.stacked-crooked.com/a/914905e8c91f660a'我可以在这里运行它,你确定你有库boost_program_options?它位于链接器可以找到它的位置吗? –

+0

我的''/ usr/lib/x86_64-linux-gnu /'下有这个库。我甚至尝试直接链接'g ++ -o first first.cpp/usr/lib/x86_64-linux-gnu/libboost_program_options.a',但仍然失败。 – Jason

+0

注意命令行我有'g ++ -std = C++ 14 -O2 -Wall -pedantic -pthread -lboost_program_options main.cpp' vs你的。尝试'g ++ -o first first.cpp -L“/ usr/lib/x86_64-linux-gnu”-lboost_program_options' –

回答

0

我发现我以前g++-4.8,似乎我升压的版本(1.54.0)要求更高版本。在我切换到g++-5后,它正常编译。