4

I have successfully gotten boost to work in a test application by following the instructions here. I now need to create a command-line application to generate licenses. I've inherited this code and it uses boost. I think I've set everything up correctly but when I try to build I receive the Undefined symbols for architecture x86_64 error for everything using boost.

I created a command-line application:

enter image description here

I added the path for boost:

enter image description here

I even tried to change the C++ Standard Library compiler:

enter image description here

Here is some code where I am referencing the boost library:

#include <boost/date_time/posix_time/posix_time_io.hpp>

namespace bg = boost::gregorian;
namespace bp = boost::posix_time;

Here are the errors:

Undefined symbols for architecture x86_64:
  "boost::program_options::to_internal(std::string const&)", referenced from:
      std::vector<std::string, std::allocator<std::string> > boost::program_options::to_internal<std::string>(std::vector<std::string, std::allocator<std::string> > const&) in main.o
  "boost::program_options::variables_map::variables_map()", referenced from:
      _main in main.o
  "boost::program_options::options_description::add_options()", referenced from:
      _main in main.o
  "boost::program_options::options_description::m_default_line_length", referenced from:
      _main in main.o
  "boost::program_options::options_description::options_description(std::string const&, unsigned int, unsigned int)", referenced from:
      _main in main.o
  "boost::program_options::options_description_easy_init::operator()(char const*, boost::program_options::value_semantic const*, char const*)", referenced from:
      _main in main.o
  "boost::program_options::options_description_easy_init::operator()(char const*, char const*)", referenced from:
      _main in main.o
  "boost::program_options::arg", referenced from:
      boost::program_options::typed_value<std::string, char>::name() const in main.o
  "boost::program_options::store(boost::program_options::basic_parsed_options<char> const&, boost::program_options::variables_map&, bool)", referenced from:
      _main in main.o
  "boost::program_options::detail::cmdline::set_additional_parser(boost::function1<std::pair<std::string, std::string>, std::string const&>)", referenced from:
      boost::program_options::basic_command_line_parser<char>::extra_parser(boost::function1<std::pair<std::string, std::string>, std::string const&>) in main.o
  "boost::program_options::detail::cmdline::set_options_description(boost::program_options::options_description const&)", referenced from:
      boost::program_options::basic_command_line_parser<char>::options(boost::program_options::options_description const&) in main.o
  "boost::program_options::detail::cmdline::get_canonical_option_prefix()", referenced from:
      boost::program_options::basic_command_line_parser<char>::run() in main.o
  "boost::program_options::detail::cmdline::run()", referenced from:
      boost::program_options::basic_command_line_parser<char>::run() in main.o
  "boost::program_options::detail::cmdline::style(int)", referenced from:
      boost::program_options::basic_command_line_parser<char>::style(int) in main.o
  "boost::program_options::detail::cmdline::cmdline(std::vector<std::string, std::allocator<std::string> > const&)", referenced from:
      boost::program_options::basic_command_line_parser<char>::basic_command_line_parser(int, char const* const*) in main.o
  "boost::program_options::notify(boost::program_options::variables_map&)", referenced from:
      _main in main.o
  "boost::program_options::validate(boost::any&, std::vector<std::string, std::allocator<std::string> > const&, std::string*, int)", referenced from:
      boost::program_options::typed_value<std::string, char>::xparse(boost::any&, std::vector<std::string, std::allocator<std::string> > const&) const in main.o
  "boost::program_options::operator<<(std::ostream&, boost::program_options::options_description const&)", referenced from:
      _main in main.o
  "boost::program_options::error_with_option_name::get_canonical_option_name() const", referenced from:
      boost::program_options::error_with_option_name::get_option_name() const in main.o
  "boost::program_options::value_semantic_codecvt_helper<char>::parse(boost::any&, std::vector<std::string, std::allocator<std::string> > const&, bool) const", referenced from:
      vtable for boost::program_options::typed_value<std::string, char> in main.o
  "typeinfo for boost::program_options::error_with_option_name", referenced from:
      typeinfo for boost::program_options::required_option in main.o
  "typeinfo for boost::program_options::value_semantic_codecvt_helper<char>", referenced from:
      typeinfo for boost::program_options::typed_value<std::string, char> in main.o
  "vtable for boost::program_options::variables_map", referenced from:
      boost::program_options::variables_map::~variables_map() in main.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "vtable for boost::program_options::value_semantic_codecvt_helper<char>", referenced from:
      boost::program_options::value_semantic_codecvt_helper<char>::value_semantic_codecvt_helper() in main.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Has anybody gotten a command-line application using boost to successfully build? If YES, then can you please help?

Thank you.

Community
  • 1
  • 1
Patricia
  • 5,019
  • 14
  • 72
  • 152
  • You simply need to link to the proper boost libraries. [There are plenty of Q&As that explain how](http://stackoverflow.com/search?q=[c%2B%2B][boost][xcode]+linking). – Jesse Good Feb 05 '14 at 23:55
  • @JesseGood - You are correct but, as I said in my post, I did get boost working in a test app. It was very difficult to get it to work the first time and because there were so many hoops to go through I am not sure what I did or didn't do. And, yes, there are plenty of Q&As and I think I've looked at all of them. I will continue to look at my setup and try more options. In the meantime, I am still hopeful that someone else may be able to help. Thank you. – Patricia Feb 06 '14 at 14:54

1 Answers1

3

The problem may be caused for two different problems:

  1. You haven't linked the library propertly:

In "Build Phases" Tab, in "Link Binary with libaries" add: libboost_program_options.a

  1. Another problem is how have you compiled and linked the boost library when you installed the library.

If you want to use libstdc++ you should build boost like this:

./bootstrap.sh
./b2 cxxflags="-stdlib=libstdc++" linkflags="-stdlib=libstdc++"
./b2 install --prefix=YOURINSTALLATIONDIRECTORY

And then use libstdc++ in xcode.

Oscar Raig Colon
  • 1,302
  • 12
  • 14