Package: libboost-program-options-dev Version: 1.58.0.1 Dear maintainer,
I cannot link against recent boost_program_options with clang++, while it works fine with g++. I have attached a small test program that demonstrates the bug. $ g++ -o options options.cpp -lboost_program_options $ ./options --filename asdf Filename is asdf (No problem, works as intended) $ clang++ -o options options.cpp -lboost_program_options /tmp/options-18b2b2.o: In function `boost::program_options::typed_value<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, char>::name() const': options.cpp:(.text._ZNK5boost15program_options11typed_valueINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEcE4nameEv[_ZNK5boost15program_options11typed_valueINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEcE4nameEv]+0x4c): undefined reference to `boost::program_options::arg' clang: error: linker command failed with exit code 1 (use -v to see invocation) I believe this is because the symbol is only exported using the new [abi:cxx11] which apparently g++ understands but clang++ doesn't. $ nm -D /usr/lib/x86_64-linux-gnu/libboost_program_options.so | c++filt | grep boost::program_options::arg 000000000027d920 B boost::program_options::arg[abi:cxx11] I am running debian sid, so these should be quite recent versions: $ g++ --version g++ (Debian 5.2.1-15) 5.2.1 20150808 $ clang++ --version Debian clang version 3.5.2-2 (tags/RELEASE_352/final) (based on LLVM 3.5.2) I also tested with clang-3.8 package, same results (undefined reference to boost::program_options::arg) $ clang++-3.8 --version Debian clang version 3.8.0-svn245286-1 (trunk) (based on LLVM 3.8.0) Is it possible to compile boost_program_options (and possibly other not-pure-header-parts of boost) in a dual-abi way, so that Clang can link to it aswell? Or did I miss a flag on calling clang as a user? On a jessie VM, the above commands work as expected, so from a user perspective, this is a regression. I'm not sure whether this is a boost or a clang issue, please redirect if I reported against the wrong package. Thank you, - Danny
#include <boost/program_options.hpp> #include <string> #include <iostream> using namespace std; using namespace boost::program_options; int main(int argc, char** argv) { string fname; options_description opts("Options"); opts.add_options() ("filename,f", value<string>(&fname)->required(), "Specify file name"); variables_map vm; store( command_line_parser(argc,argv).options(opts).run(), vm); notify(vm); cout << "Filename is " << fname << endl; return 0; }