【问题标题】:Linker error with boost::program_options and C++11 on OSXOSX 上 boost::program_options 和 C++11 的链接器错误
【发布时间】:2012-11-25 19:35:25
【问题描述】:

我就这样构建了 boost:

~/Downloads/boost_1_52_0
$ sudo ./b2 --build-dir=build --layout=system -j4 toolset=clang variant=release link=shared runtime-link=shared threading=multi cxxflags="-std=c++11 -stdlib=libc++" linkflags="-stdlib=libc++" --without-mpi --without-python install

然后尝试编译第一个示例程序

~/Downloads/boost_1_52_0
$ cd libs/program_options/example                                                                                                                             [18:35:25]

~/Downloads/boost_1_52_0/libs/program_options/example
$ c++ -v -std=c++11 -stdlib=libc++ -lboost_program_options -o first first.cpp                                                                                 [18:38:32]
Apple clang version 4.1 (tags/Apple/clang-421.11.66) (based on LLVM 3.1svn)
Target: x86_64-apple-darwin11.4.2
Thread model: posix
 "/usr/bin/clang" -cc1 -triple x86_64-apple-macosx10.7.0 -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -main-file-name first.cpp -pic-level 1 -mdisable-fp-elim -relaxed-aliasing -masm-verbose -munwind-tables -target-cpu core2 -target-linker-version 134.9 -v -resource-dir /usr/bin/../lib/clang/4.1 -fmodule-cache-path /var/folders/sq/nfthwlb93k5bl9qyrjbvfylm0000gn/T/clang-module-cache -stdlib=libc++ -std=c++11 -fdeprecated-macro -fdebug-compilation-dir /Users/lexi/Downloads/boost_1_52_0/libs/program_options/example -ferror-limit 19 -fmessage-length 169 -stack-protector 1 -mstackrealign -fblocks -fobjc-runtime-has-arc -fobjc-runtime-has-weak -fobjc-dispatch-method=mixed -fobjc-default-synthesize-properties -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -o /var/folders/sq/nfthwlb93k5bl9qyrjbvfylm0000gn/T/first-oIjAae.o -x c++ first.cpp
clang -cc1 version 4.1 based upon LLVM 3.1svn default target x86_64-apple-darwin11.4.2
ignoring nonexistent directory "/usr/include/c++/v1"
#include "..." search starts here:
#include <...> search starts here:
 /usr/bin/../lib/c++/v1
 /usr/local/include
 /usr/bin/../lib/clang/4.1/include
 /usr/include
 /System/Library/Frameworks (framework directory)
 /Library/Frameworks (framework directory)
End of search list.
 "/usr/bin/ld" -demangle -dynamic -arch x86_64 -macosx_version_min 10.7.0 -o first -lcrt1.10.6.o -lboost_program_options /var/folders/sq/nfthwlb93k5bl9qyrjbvfylm0000gn/T/first-oIjAae.o -lc++ -lSystem /usr/bin/../lib/clang/4.1/lib/darwin/libclang_rt.osx.a
Undefined symbols for architecture x86_64:
  "boost::program_options::validation_error::validation_error(boost::program_options::validation_error::kind_t, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:
      std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const& boost::program_options::validators::get_single_string<char>(std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&, bool) in first-oIjAae.o
  "boost::program_options::validation_error::what() const", referenced from:
      vtable for boost::exception_detail::error_info_injector<boost::program_options::invalid_option_value> in first-oIjAae.o
      vtable for boost::program_options::invalid_option_value in first-oIjAae.o
      vtable for boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::program_options::invalid_option_value> > in first-oIjAae.o
      vtable for boost::exception_detail::error_info_injector<boost::program_options::validation_error> in first-oIjAae.o
      vtable for boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::program_options::validation_error> > in first-oIjAae.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我做错了什么?我能找到的唯一类似错误是Linker error with Boost & C++ on OSX,但他使用的是 CMake、gcc 和 c++03,并且他的“我重新编译了 Boost 并且它有效”的解决方案并不是特别有用。

这也绝对不是代码的错,因为 bjam 可以构建示例,但我对编译器的理解不够,无法查看输出并说“哦,原来你就是这样!”

~/Downloads/boost_1_52_0/libs/program_options/example
$ ../../../b2 -ad+2 toolset=clang cxxflags="-std=c++11 -stdlib=libc++" linkflags="-stdlib=libc++" first
clang-darwin.compile.c++ ../../../bin.v2/libs/program_options/example/clang-darwin-4.2.1/debug/link-static/first.o

    "clang++" -x c++ -O0 -g -std=c++11 -stdlib=libc++ -O0 -fno-inline -Wall -g -DBOOST_ALL_NO_LIB=1 -I"../../.." -c -o "../../../bin.v2/libs/program_options/example/clang-darwin-4.2.1/debug/link-static/first.o" "first.cpp"

clang-darwin.compile.c++ ../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/cmdline.o

    "clang++" -x c++ -O0 -g -std=c++11 -stdlib=libc++ -O0 -fno-inline -Wall -g -DBOOST_ALL_NO_LIB=1 -I"../../.." -c -o "../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/cmdline.o" "../../../libs/program_options/src/cmdline.cpp"

clang-darwin.compile.c++ ../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/config_file.o

    "clang++" -x c++ -O0 -g -std=c++11 -stdlib=libc++ -O0 -fno-inline -Wall -g -DBOOST_ALL_NO_LIB=1 -I"../../.." -c -o "../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/config_file.o" "../../../libs/program_options/src/config_file.cpp"

clang-darwin.compile.c++ ../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/options_description.o

    "clang++" -x c++ -O0 -g -std=c++11 -stdlib=libc++ -O0 -fno-inline -Wall -g -DBOOST_ALL_NO_LIB=1 -I"../../.." -c -o "../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/options_description.o" "../../../libs/program_options/src/options_description.cpp"

clang-darwin.compile.c++ ../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/parsers.o

    "clang++" -x c++ -O0 -g -std=c++11 -stdlib=libc++ -O0 -fno-inline -Wall -g -DBOOST_ALL_NO_LIB=1 -I"../../.." -c -o "../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/parsers.o" "../../../libs/program_options/src/parsers.cpp"

clang-darwin.compile.c++ ../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/variables_map.o

    "clang++" -x c++ -O0 -g -std=c++11 -stdlib=libc++ -O0 -fno-inline -Wall -g -DBOOST_ALL_NO_LIB=1 -I"../../.." -c -o "../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/variables_map.o" "../../../libs/program_options/src/variables_map.cpp"

clang-darwin.compile.c++ ../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/value_semantic.o

    "clang++" -x c++ -O0 -g -std=c++11 -stdlib=libc++ -O0 -fno-inline -Wall -g -DBOOST_ALL_NO_LIB=1 -I"../../.." -c -o "../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/value_semantic.o" "../../../libs/program_options/src/value_semantic.cpp"

clang-darwin.compile.c++ ../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/positional_options.o

    "clang++" -x c++ -O0 -g -std=c++11 -stdlib=libc++ -O0 -fno-inline -Wall -g -DBOOST_ALL_NO_LIB=1 -I"../../.." -c -o "../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/positional_options.o" "../../../libs/program_options/src/positional_options.cpp"

clang-darwin.compile.c++ ../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/utf8_codecvt_facet.o

    "clang++" -x c++ -O0 -g -std=c++11 -stdlib=libc++ -O0 -fno-inline -Wall -g -DBOOST_ALL_NO_LIB=1 -I"../../.." -c -o "../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/utf8_codecvt_facet.o" "../../../libs/program_options/src/utf8_codecvt_facet.cpp"

In file included from ../../../libs/program_options/src/utf8_codecvt_facet.cpp:15:
In file included from ../../../boost/detail/utf8_codecvt_facet.ipp:13:
../../../boost/detail/utf8_codecvt_facet.hpp:171:17: warning: 'boost::program_options::detail::utf8_codecvt_facet::do_length' hides overloaded virtual function [-Woverloaded-virtual]
    virtual int do_length(
                ^
/usr/bin/../lib/c++/v1/__locale:920:17: note: hidden overloaded virtual function 'std::__1::codecvt<wchar_t, char, __mbstate_t>::do_length' declared here
    virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, size_t __mx) const;
                ^
1 warning generated.
clang-darwin.compile.c++ ../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/convert.o

    "clang++" -x c++ -O0 -g -std=c++11 -stdlib=libc++ -O0 -fno-inline -Wall -g -DBOOST_ALL_NO_LIB=1 -I"../../.." -c -o "../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/convert.o" "../../../libs/program_options/src/convert.cpp"

In file included from ../../../libs/program_options/src/convert.cpp:19:
In file included from ../../../boost/program_options/detail/utf8_codecvt_facet.hpp:19:
../../../boost/detail/utf8_codecvt_facet.hpp:171:17: warning: 'boost::program_options::detail::utf8_codecvt_facet::do_length' hides overloaded virtual function [-Woverloaded-virtual]
    virtual int do_length(
                ^
/usr/bin/../lib/c++/v1/__locale:920:17: note: hidden overloaded virtual function 'std::__1::codecvt<wchar_t, char, __mbstate_t>::do_length' declared here
    virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, size_t __mx) const;
                ^
1 warning generated.
clang-darwin.compile.c++ ../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/winmain.o

    "clang++" -x c++ -O0 -g -std=c++11 -stdlib=libc++ -O0 -fno-inline -Wall -g -DBOOST_ALL_NO_LIB=1 -I"../../.." -c -o "../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/winmain.o" "../../../libs/program_options/src/winmain.cpp"

clang-darwin.compile.c++ ../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/split.o

    "clang++" -x c++ -O0 -g -std=c++11 -stdlib=libc++ -O0 -fno-inline -Wall -g -DBOOST_ALL_NO_LIB=1 -I"../../.." -c -o "../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/split.o" "../../../libs/program_options/src/split.cpp"

RmTemps ../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/libboost_program_options.a(clean)

    rm -f "../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/libboost_program_options.a" 

clang-darwin.archive ../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/libboost_program_options.a

  "ar"  rc "../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/libboost_program_options.a" "../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/cmdline.o" "../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/config_file.o" "../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/options_description.o" "../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/parsers.o" "../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/variables_map.o" "../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/value_semantic.o" "../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/positional_options.o" "../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/utf8_codecvt_facet.o" "../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/convert.o" "../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/winmain.o" "../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/split.o"
  "ranlib" -cs "../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/libboost_program_options.a"

clang-darwin.link ../../../bin.v2/libs/program_options/example/clang-darwin-4.2.1/debug/link-static/first

    "clang++" -stdlib=libc++ -stdlib=libc++  -o "../../../bin.v2/libs/program_options/example/clang-darwin-4.2.1/debug/link-static/first" "../../../bin.v2/libs/program_options/example/clang-darwin-4.2.1/debug/link-static/first.o" "../../../bin.v2/libs/program_options/build/clang-darwin-4.2.1/debug/link-static/libboost_program_options.a"    -g


~/Downloads/boost_1_52_0/libs/program_options/example
$ ../../../bin.v2/libs/program_options/example/clang-darwin-4.2.1/debug/link-static/first
Compression level was not set.

【问题讨论】:

  • 有什么理由让自己建立提升吗?如果没有,只需从自制软件安装它并感到高兴。编辑:哎呀,没有注意到这是一岁,虽然我认为它仍然是有效的问题。
  • @bamboon 我需要将它链接到 clang 的 c++11 中的 libc++,以便我可以将它链接到我的 clang/libc++/c++11 程序。事实上,我从来没有解决过这个问题,然后我的 macbook 爆炸了(保修两天!)从好的方面来说,它现在在 Linux 上运行良好。

标签: c++ macos boost clang xcode4.5


【解决方案1】:

首先你需要libc++abi

其次,您必须将-nodefaultlibs -lc++ -lc++abi -lm -lc -lgcc_s -lgcc-lc++abi 添加到链接器命令中。对于一个文件,它应该如下所示:

`clang++ -stdlib=libc++ helloworld.cpp -nodefaultlibs -lc++ -lc++abi -lm -lc -lgcc_s -lgcc`

或者这个:

`clang++ -stdlib=libc++ helloworld.cpp -lc++abi`

更多信息见libc++官方页面

【讨论】:

  • ld: 找不到 -lsupc++ 的库
  • 我做了一些谷歌搜索,我发现的大部分结果似乎表明 OSX 没有(或不需要?)那个库。
  • 你能建那个库吗?
  • 抱歉,我最近很忙。我做了一些查找,发现 libsupc++ 是 g++/libstdc++ 的一部分,而我正在使用 clang/libc++。我很确定尝试混合标准库不是这里的解决方案,特别是因为工作示例没有这样做。
猜你喜欢
  • 2012-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
相关资源
最近更新 更多