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;
}