Надоело изобретать велосипед, решил начать использовать готовые библиотеки.
Boost установил скомпилированный, из реп.
Открываю примеры, например, boost/libs/program_options/example/first.cpp
#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++ first.cpp -o first
Вываливается тонна жести:
/tmp/ccBji0hK.o: In function `main':
first.cpp:(.text+0x2c): undefined reference to `boost::program_options::options_description::m_default_line_length'
first.cpp:(.text+0x30): undefined reference to `boost::program_options::options_description::m_default_line_length'
first.cpp:(.text+0x36): undefined reference to `boost::program_options::options_description::m_default_line_length'
first.cpp:(.text+0x3a): undefined reference to `boost::program_options::options_description::m_default_line_length'
first.cpp:(.text+0x4c): undefined reference to `boost::program_options::options_description::options_description(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int, unsigned int)'
first.cpp:(.text+0x6a): undefined reference to `boost::program_options::options_description::add_options()'
first.cpp:(.text+0x8a): undefined reference to `boost::program_options::options_description_easy_init::operator()(char const*, char const*)'
first.cpp:(.text+0xac): undefined reference to `boost::program_options::options_description_easy_init::operator()(char const*, boost::program_options::value_semantic const*, char const*)'
first.cpp:(.text+0xb6): undefined reference to `boost::program_options::variables_map::variables_map()'
first.cpp:(.text+0xf2): undefined reference to `boost::program_options::store(boost::program_options::basic_parsed_options<char> const&, boost::program_options::variables_map&, bool)'
first.cpp:(.text+0x110): undefined reference to `boost::program_options::notify(boost::program_options::variables_map&)'
first.cpp:(.text+0x17c): undefined reference to `boost::program_options::operator<<(std::basic_ostream<char, std::char_traits<char> >&, boost::program_options::options_description const&)'
/tmp/ccBji0hK.o: In function `boost::program_options::validation_error::~validation_error()':
first.cpp:(.text._ZN5boost15program_options16validation_errorD2Ev[_ZN5boost15program_options16validation_errorD5Ev]+0xa0): undefined reference to `vtable for boost::program_options::validation_error'
/tmp/ccBji0hK.o: In function `boost::program_options::value_semantic_codecvt_helper<char>::value_semantic_codecvt_helper()':
first.cpp:(.text._ZN5boost15program_options29value_semantic_codecvt_helperIcEC2Ev[_ZN5boost15program_options29value_semantic_codecvt_helperIcEC5Ev]+0x24): undefined reference to `vtable for boost::program_options::value_semantic_codecvt_helper<char>'
/tmp/ccBji0hK.o: In function `boost::program_options::value_semantic_codecvt_helper<char>::~value_semantic_codecvt_helper()':
first.cpp:(.text._ZN5boost15program_options29value_semantic_codecvt_helperIcED2Ev[_ZN5boost15program_options29value_semantic_codecvt_helperIcED5Ev]+0x38): undefined reference to `vtable for boost::program_options::value_semantic_codecvt_helper<char>'
/tmp/ccBji0hK.o: In function `boost::program_options::variables_map::operator[](std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const':
first.cpp:(.text._ZNK5boost15program_options13variables_mapixERKSs[boost::program_options::variables_map::operator[](std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const]+0x10): undefined reference to `boost::program_options::abstract_variables_map::operator[](std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const'
/tmp/ccBji0hK.o: In function `boost::program_options::variables_map::~variables_map()':
first.cpp:(.text._ZN5boost15program_options13variables_mapD2Ev[_ZN5boost15program_options13variables_mapD5Ev]+0x84): undefined reference to `vtable for boost::program_options::variables_map'
/tmp/ccBji0hK.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]+0x56): undefined reference to `boost::program_options::detail::cmdline::cmdline(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&)'
/tmp/ccBji0hK.o: In function `boost::program_options::basic_command_line_parser<char>::options(boost::program_options::options_description const&)':
first.cpp:(.text._ZN5boost15program_options25basic_command_line_parserIcE7optionsERKNS0_19options_descriptionE[boost::program_options::basic_command_line_parser<char>::options(boost::program_options::options_description const&)]+0x10): undefined reference to `boost::program_options::detail::cmdline::set_options_description(boost::program_options::options_description const&)'
/tmp/ccBji0hK.o: In function `boost::program_options::basic_command_line_parser<char>::style(int)':
first.cpp:(.text._ZN5boost15program_options25basic_command_line_parserIcE5styleEi[boost::program_options::basic_command_line_parser<char>::style(int)]+0x10): undefined reference to `boost::program_options::detail::cmdline::style(int)'
/tmp/ccBji0hK.o: In function `boost::program_options::basic_command_line_parser<char>::extra_parser(boost::function1<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>)':
first.cpp:(.text._ZN5boost15program_options25basic_command_line_parserIcE12extra_parserENS_9function1ISt4pairISsSsERKSsEE[boost::program_options::basic_command_line_parser<char>::extra_parser(boost::function1<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>)]+0x20): undefined reference to `boost::program_options::detail::cmdline::set_additional_parser(boost::function1<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>)'
/tmp/ccBji0hK.o: In function `boost::program_options::basic_command_line_parser<char>::run()':
first.cpp:(.text._ZN5boost15program_options25basic_command_line_parserIcE3runEv[boost::program_options::basic_command_line_parser<char>::run()]+0x24): undefined reference to `boost::program_options::detail::cmdline::run()'
/tmp/ccBji0hK.o: In function `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> > > > boost::program_options::to_internal<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >(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&)':
first.cpp:(.text._ZN5boost15program_options11to_internalISsEESt6vectorISsSaISsEERKS2_IT_SaIS5_EE[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> > > > boost::program_options::to_internal<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >(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&)]+0x2a): undefined reference to `boost::program_options::to_internal(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/tmp/ccBji0hK.o:(.rodata._ZTVN5boost15program_options11typed_valueIdcEE[vtable for boost::program_options::typed_value<double, char>]+0x1c): undefined reference to `boost::program_options::value_semantic_codecvt_helper<char>::parse(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&, bool) const'
/tmp/ccBji0hK.o:(.rodata._ZTVN5boost15program_options20invalid_option_valueE[vtable for boost::program_options::invalid_option_value]+0x10): undefined reference to `boost::program_options::validation_error::what() const'
/tmp/ccBji0hK.o:(.rodata._ZTIN5boost15program_options11typed_valueIdcEE[typeinfo for boost::program_options::typed_value<double, char>]+0x10): undefined reference to `typeinfo for boost::program_options::value_semantic_codecvt_helper<char>'
/tmp/ccBji0hK.o: In function `boost::program_options::typed_value<double, char>::name() const':
first.cpp:(.text._ZNK5boost15program_options11typed_valueIdcE4nameEv[boost::program_options::typed_value<double, char>::name() const]+0x174): undefined reference to `boost::program_options::arg'
first.cpp:(.text._ZNK5boost15program_options11typed_valueIdcE4nameEv[boost::program_options::typed_value<double, char>::name() const]+0x178): undefined reference to `boost::program_options::arg'
first.cpp:(.text._ZNK5boost15program_options11typed_valueIdcE4nameEv[boost::program_options::typed_value<double, char>::name() const]+0x1ce): undefined reference to `boost::program_options::arg'
first.cpp:(.text._ZNK5boost15program_options11typed_valueIdcE4nameEv[boost::program_options::typed_value<double, char>::name() const]+0x1d2): undefined reference to `boost::program_options::arg'
/tmp/ccBji0hK.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[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)]+0x10): undefined reference to `boost::program_options::validators::check_first_occurrence(boost::any const&)'
first.cpp:(.text._ZN5boost15program_options8validateIdcEEvRNS_3anyERKSt6vectorISbIT0_St11char_traitsIS5_ESaIS5_EESaIS9_EEPT_l[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)]+0xaa): undefined reference to `boost::program_options::invalid_option_value::invalid_option_value(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/tmp/ccBji0hK.o: In function `std::basic_string<char, std::char_traits<char>, std::allocator<char> > const& boost::program_options::validators::get_single_string<char>(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&, bool)':
first.cpp:(.text._ZN5boost15program_options10validators17get_single_stringIcEERKSbIT_St11char_traitsIS3_ESaIS3_EERKSt6vectorIS7_SaIS7_EEb[std::basic_string<char, std::char_traits<char>, std::allocator<char> > const& boost::program_options::validators::get_single_string<char>(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&, bool)]+0xe0): undefined reference to `boost::program_options::validation_error::validation_error(boost::program_options::validation_error::kind_t, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
first.cpp:(.text._ZN5boost15program_options10validators17get_single_stringIcEERKSbIT_St11char_traitsIS3_ESaIS3_EERKSt6vectorIS7_SaIS7_EEb[std::basic_string<char, std::char_traits<char>, std::allocator<char> > const& boost::program_options::validators::get_single_string<char>(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&, bool)]+0x170): undefined reference to `boost::program_options::validation_error::validation_error(boost::program_options::validation_error::kind_t, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/tmp/ccBji0hK.o: In function `boost::program_options::validation_error::validation_error(boost::program_options::validation_error const&)':
first.cpp:(.text._ZN5boost15program_options16validation_errorC2ERKS1_[_ZN5boost15program_options16validation_errorC5ERKS1_]+0x94): undefined reference to `vtable for boost::program_options::validation_error'
/tmp/ccBji0hK.o:(.rodata._ZTVN5boost16exception_detail10clone_implINS0_19error_info_injectorINS_15program_options16validation_errorEEEEE[vtable for boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::program_options::validation_error> >]+0x10): undefined reference to `boost::program_options::validation_error::what() const'
/tmp/ccBji0hK.o:(.rodata._ZTVN5boost16exception_detail19error_info_injectorINS_15program_options16validation_errorEEE[vtable for boost::exception_detail::error_info_injector<boost::program_options::validation_error>]+0x10): undefined reference to `boost::program_options::validation_error::what() const'
/tmp/ccBji0hK.o:(.rodata._ZTVN5boost16exception_detail10clone_implINS0_19error_info_injectorINS_15program_options20invalid_option_valueEEEEE[vtable for boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::program_options::invalid_option_value> >]+0x10): undefined reference to `boost::program_options::validation_error::what() const'
/tmp/ccBji0hK.o:(.rodata._ZTVN5boost16exception_detail19error_info_injectorINS_15program_options20invalid_option_valueEEE[vtable for boost::exception_detail::error_info_injector<boost::program_options::invalid_option_value>]+0x10): undefined reference to `boost::program_options::validation_error::what() const'
/tmp/ccBji0hK.o:(.rodata._ZTIN5boost16exception_detail19error_info_injectorINS_15program_options16validation_errorEEE[typeinfo for boost::exception_detail::error_info_injector<boost::program_options::validation_error>]+0x10): undefined reference to `typeinfo for boost::program_options::validation_error'
/tmp/ccBji0hK.o:(.rodata._ZTIN5boost15program_options20invalid_option_valueE[typeinfo for boost::program_options::invalid_option_value]+0x8): undefined reference to `typeinfo for boost::program_options::validation_error'
collect2: ld returned 1 exit status
g++ first.cpp -o first 9,77s user 0,63s system 99% cpu 10,433 total
Boost установлен, вот библиотеки:
ls /usr/lib | grep -i libboost
libboost_chrono.a
libboost_chrono-mt.a@
libboost_chrono-mt.so@
libboost_chrono.so@
libboost_chrono.so.1.49.0
libboost_date_time.a
libboost_date_time-mt.a@
libboost_date_time-mt.so@
libboost_date_time.so@
libboost_date_time.so.1.49.0
libboost_filesystem.a
libboost_filesystem-mt.a@
libboost_filesystem-mt.so@
libboost_filesystem.so@
libboost_filesystem.so.1.49.0
libboost_graph.a
libboost_graph-mt.a@
libboost_graph-mt.so@
libboost_graph_parallel.a
libboost_graph_parallel-mt.a@
libboost_graph_parallel-mt.so@
libboost_graph_parallel.so@
libboost_graph.so@
libboost_iostreams.a
libboost_iostreams-mt.a@
libboost_iostreams-mt.so@
libboost_iostreams.so@
libboost_iostreams.so.1.49.0
libboost_locale.a
libboost_locale-mt.a@
libboost_locale-mt.so@
libboost_locale.so@
libboost_locale.so.1.49.0
libboost_math_c99.a
libboost_math_c99f.a
libboost_math_c99f-mt.a@
libboost_math_c99f-mt.so@
libboost_math_c99f.so@
libboost_math_c99f.so.1.49.0
libboost_math_c99-mt.a@
libboost_math_c99-mt.so@
libboost_math_c99.so@
libboost_math_c99.so.1.49.0
libboost_math_tr1.a
libboost_math_tr1f.a
libboost_math_tr1f-mt.a@
libboost_math_tr1f-mt.so@
libboost_math_tr1f.so@
libboost_math_tr1f.so.1.49.0
libboost_math_tr1-mt.a@
libboost_math_tr1-mt.so@
libboost_math_tr1.so@
libboost_math_tr1.so.1.49.0
libboost_mpi.a
libboost_mpi-mt.a@
libboost_mpi-mt.so@
libboost_mpi_python.a@
libboost_mpi_python-mt-py26.a@
libboost_mpi_python-mt-py26.so@
libboost_mpi_python-mt-py27.a@
libboost_mpi_python-mt-py27.so@
libboost_mpi_python-mt-py32.a@
libboost_mpi_python-mt-py32.so@
libboost_mpi_python-py26.a
libboost_mpi_python-py26.so@
libboost_mpi_python-py26.so.1.49.0
libboost_mpi_python-py27.a
libboost_mpi_python-py27.so@
libboost_mpi_python-py27.so.1.49.0
libboost_mpi_python-py32.a
libboost_mpi_python-py32.so@
libboost_mpi_python-py32.so.1.49.0
libboost_mpi_python.so@
libboost_mpi.so@
libboost_mpi.so.1.49.0
libboost_prg_exec_monitor.a
libboost_prg_exec_monitor-mt.a@
libboost_prg_exec_monitor-mt.so@
libboost_prg_exec_monitor.so@
libboost_prg_exec_monitor.so.1.49.0
libboost_program_options.a
libboost_program_options-mt.a@
libboost_program_options-mt.so@
libboost_program_options.so@
libboost_program_options.so.1.49.0
libboost_python.a@
libboost_python-mt-py26.a@
libboost_python-mt-py26.so@
libboost_python-mt-py27.a@
libboost_python-mt-py27.so@
libboost_python-mt-py32.a@
libboost_python-mt-py32.so@
libboost_python-py26.a
libboost_python-py26.so@
libboost_python-py26.so.1.49.0
libboost_python-py27.a
libboost_python-py27.so@
libboost_python-py27.so.1.49.0
libboost_python-py32.a
libboost_python-py32.so@
libboost_python-py32.so.1.49.0
libboost_python.so@
libboost_random.a
libboost_random-mt.a@
libboost_random-mt.so@
libboost_random.so@
libboost_random.so.1.49.0
libboost_regex.a
libboost_regex-mt.a@
libboost_regex-mt.so@
libboost_regex.so@
libboost_regex.so.1.49.0
libboost_serialization.a
libboost_serialization-mt.a@
libboost_serialization-mt.so@
libboost_serialization.so@
libboost_serialization.so.1.49.0
libboost_signals.a
libboost_signals-mt.a@
libboost_signals-mt.so@
libboost_signals.so@
libboost_signals.so.1.49.0
libboost_system.a
libboost_system-mt.a@
libboost_system-mt.so@
libboost_system.so@
libboost_system.so.1.49.0
libboost_test_exec_monitor.a
libboost_test_exec_monitor-mt.a@
libboost_thread.a
libboost_thread-mt.a@
libboost_thread-mt.so@
libboost_thread.so@
libboost_thread.so.1.49.0
libboost_timer.a
libboost_timer-mt.a@
libboost_timer-mt.so@
libboost_timer.so@
libboost_timer.so.1.49.0
libboost_unit_test_framework.a
libboost_unit_test_framework-mt.a@
libboost_unit_test_framework-mt.so@
libboost_unit_test_framework.so@
libboost_unit_test_framework.so.1.49.0
libboost_wave.a
libboost_wave-mt.a@
libboost_wave-mt.so@
libboost_wave.so@
libboost_wave.so.1.49.0
libboost_wserialization.a
libboost_wserialization-mt.a@
libboost_wserialization-mt.so@
libboost_wserialization.so@
libboost_wserialization.so.1.49.0
Чего же не так?
Пользователь решил продолжить мысль 25 Апреля 2015, 00:57:41:
Ха, всё, решил проблему. Нужно указывать параметром, какие библиотеки я использую. Вопрос снят.
g++ first.cpp -o first -lboost_program_options