【问题标题】:Link error in Boost program_options code on UbuntuUbuntu 上的 Boost program_options 代码中的链接错误
【发布时间】:2011-12-28 05:10:36
【问题描述】:

我在 ubuntu 10.04 上安装了 boost by

sudo apt-get install libboost-dev

我认为在那之后我不需要设置任何 -I 和 -L 标志,所以我编译我的代码

g++ test.cpp

这是我的 test.cpp

#include <iostream>
#include <string>
#include <set>
#include <sstream>

#include <boost/config.hpp>
#include <boost/program_options/detail/config_file.hpp>
#include <boost/program_options/parsers.hpp>

namespace pod = boost::program_options::detail;

int main() 
{  
    //contents
    std::stringstream s(
            "a = 1\n"
            "b = 2\n"
            "c = test option\n");
    //parameters
    std::set<std::string> options;
    options.insert("a");
    options.insert("b");
    options.insert("c");

    //parser
    for (pod::config_file_iterator i(s, options), e ; i != e; ++i)
    {
        std::cout << i->value[0] << std::endl;
    }
}

我认为事情会顺利,但实际上有一些错误:

/tmp/ccNQEbJM.o: In function `boost::program_options::detail::basic_config_file_iterator<char>::basic_config_file_iterator(std::basic_istream<char, std::char_traits<char> >&, std::set<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<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&, bool)':
a.cpp:(.text._ZN5boost15program_options6detail26basic_config_file_iteratorIcEC1ERSiRKSt3setISsSt4lessISsESaISsEEb[boost::program_options::detail::basic_config_file_iterator<char>::basic_config_file_iterator(std::basic_istream<char, std::char_traits<char> >&, std::set<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<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&, bool)]+0x24): undefined reference to `boost::program_options::detail::common_config_file_iterator::common_config_file_iterator(std::set<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<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&, bool)'
a.cpp:(.text._ZN5boost15program_options6detail26basic_config_file_iteratorIcEC1ERSiRKSt3setISsSt4lessISsESaISsEEb[boost::program_options::detail::basic_config_file_iterator<char>::basic_config_file_iterator(std::basic_istream<char, std::char_traits<char> >&, std::set<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<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&, bool)]+0x5f): undefined reference to `boost::program_options::detail::common_config_file_iterator::get()'
/tmp/ccNQEbJM.o: In function `boost::eof_iterator<boost::program_options::detail::common_config_file_iterator, boost::program_options::basic_option<char> >::increment()':
a.cpp:(.text._ZN5boost12eof_iteratorINS_15program_options6detail27common_config_file_iteratorENS1_12basic_optionIcEEE9incrementEv[boost::eof_iterator<boost::program_options::detail::common_config_file_iterator, boost::program_options::basic_option<char> >::increment()]+0x10): undefined reference to `boost::program_options::detail::common_config_file_iterator::get()'
/tmp/ccNQEbJM.o: In function `boost::program_options::detail::basic_config_file_iterator<char>::getline(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)':
a.cpp:(.text._ZN5boost15program_options6detail26basic_config_file_iteratorIcE7getlineERSs[boost::program_options::detail::basic_config_file_iterator<char>::getline(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)]+0x5b): undefined reference to `boost::program_options::to_internal(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
collect2: ld returned 1 exit status

我不知道我出错的地方和原因。

【问题讨论】:

  • 您从未链接到 boost 库。您确实需要指定适当的-l 选项。
  • 如何?我通过 sudo apt-get install libboost-dev 安装 boost。我不知道图书馆在哪里。我通过“g++ test.cpp -lboost-program_options”指定,但无法加载 lboost-program_options。
  • 都是下划线,boost后面有个'-'应该是'_'
  • 我尝试“g++ test.cpp -lboost_program_options”,再次失败。错误消息:/usr/bin/ld: 找不到 -lboost_program_options collect2: ld 返回 1 个退出状态 我错过了做某事吗?或者链接错误的库名?
  • 在哪里可以找到这些库? /usr/lib?我在哪里可以获得类似于 program_options 的库的名称?

标签: c++ boost ubuntu hyperlink


【解决方案1】:

您需要链接到 Boost program_options 库,因为 Boost 中并非所有内容都是纯模板:

edd@max:/tmp$ cat bpoex.cpp 
#include <iostream>
#include <string>
#include <set>
#include <sstream>

#include <boost/config.hpp>
#include <boost/program_options/detail/config_file.hpp>
#include <boost/program_options/parsers.hpp>

namespace pod = boost::program_options::detail;

int main() 
{  
    //contents
    std::stringstream s(
            "a = 1\n"
            "b = 2\n"
            "c = test option\n");
    //parameters
    std::set<std::string> options;
    options.insert("a");
    options.insert("b");
    options.insert("c");

    //parser
    for (pod::config_file_iterator i(s, options), e ; i != e; ++i)
    {
        std::cout << i->value[0] << std::endl;
    }
}
edd@max:/tmp$ g++ -o bpoex bpoex.cpp -lboost_program_options
edd@max:/tmp$ ./bpoex
1
2
test option
edd@max:/tmp$ 

【讨论】:

  • /usr/bin/ld: 找不到 -lboost_program_options collect2: ld 返回 1 退出状态为什么我无法链接 boost_program_options?
  • 我知道我错过了哪里。尴尬的是“sudo apt-get install libboost-dev”不安装库program_options。我需要通过“sudo apt-get libboost-program-options-dev”安装它。之后,我可以使用“g++ test.cpp -lboost_program_options”像你刚才所做的那样进行编译。谢谢 Dirk,David,fefe。
  • "sudo apt-get install libboost-all-dev" 将安装所有 boost 库。
  • 很高兴知道你已经成功了。这里习惯于“投票”好的答案,如果合适的话,也“接受”作为解决方案的答案。您可以通过单击帖子左上角的符号来做到这一点。
  • @DirkEddelbuettel 出于好奇,如果您没有告诉我们库名称 (boost_program_options),如何找到它?我们是否必须认识一个认识一个认识写图书馆的人的人?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 2021-07-03
  • 2015-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多