如何使用clang链接boost库1.54?

如何使用clang链接boost库1.54?,boost,compiler-construction,linker,clang,Boost,Compiler Construction,Linker,Clang,我已经用叮当声在我的mac上安装了boost Include = /usr/local/include/boost-1_54/ Lib = /usr/local/lib/ (libboost_atomic-clang-darwin42-mt-1_54.a,libboost_math_c99f-clang-darwin42-mt-1_54.dylib) 然后我想测试一下安装是否正确。我尝试编译一个使用boost::regex的简单代码 $$ clang++ -I /usr/loca

我已经用叮当声在我的mac上安装了boost

Include =  /usr/local/include/boost-1_54/  
Lib    = /usr/local/lib/ 
(libboost_atomic-clang-darwin42-mt-1_54.a,libboost_math_c99f-clang-darwin42-mt-1_54.dylib)

然后我想测试一下安装是否正确。我尝试编译一个使用boost::regex的简单代码

$$ clang++ -I /usr/local/include/boost-1_54/ -L /usr/local/lib/ -o regex test_regex.cpp
它给出了错误的说法

 Undefined symbols for architecture x86_64:
 "boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::do_assign(char const*, char const*, unsigned int)", referenced from:
  boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> >           >::assign(char const*, char const*, unsigned int) in test_regex-qSWMLF.o
 "boost::re_detail::get_mem_block()", referenced from:
  boost::re_detail::perl_matcher<std::__1::__wrap_iter<char const*>, std::__1::allocator<boost::sub_match<std::__1::__wrap_iter<char const*> > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::extend_stack() in test_regex-qSWMLF.o
  boost::re_detail::save_state_init::save_state_init(boost::re_detail::saved_state**, boost::re_detail::saved_state**) in test_regex-qSWMLF.o
 "boost::re_detail::put_mem_block(void*)", referenced from:
  boost::re_detail::save_state_init::~save_state_init() in test_regex-qSWMLF.o
  boost::re_detail::perl_matcher<std::__1::__wrap_iter<char const*>, std::__1::allocator<boost::sub_match<std::__1::__wrap_iter<char const*> > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::unwind_extra_block(bool) in test_regex-qSWMLF.o
 "boost::re_detail::verify_options(unsigned int, boost::regex_constants::_match_flags)", referenced from:
  boost::re_detail::perl_matcher<std::__1::__wrap_iter<char const*>, std::__1::allocator<boost::sub_match<std::__1::__wrap_iter<char const*> > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::match_imp() in test_regex-qSWMLF.o
 "boost::re_detail::raise_runtime_error(std::runtime_error const&)", referenced from:
  void boost::re_detail::raise_error<boost::regex_traits_wrapper<boost::regex_traits<char, boost::cpp_regex_traits<char> > > >(boost::regex_traits_wrapper<boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&, boost::regex_constants::error_type) in test_regex-qSWMLF.o
 "boost::re_detail::get_default_error_string(boost::regex_constants::error_type)", referenced from:
  boost::re_detail::cpp_regex_traits_implementation<char>::error_string(boost::regex_constants::error_type) const in test_regex-qSWMLF.o
 "boost::re_detail::cpp_regex_traits_implementation<char>::transform_primary(char const*, char const*) const", referenced from:
  boost::cpp_regex_traits<char>::transform_primary(char const*, char const*) const in test_regex-qSWMLF.o
"boost::re_detail::cpp_regex_traits_implementation<char>::transform(char const*, char const*) const", referenced from:
  boost::cpp_regex_traits<char>::transform(char const*, char const*) const in test_regex-qSWMLF.o
 ld: symbol(s) not found for architecture x86_64
 clang: error: linker command failed with exit code 1 (use -v to see invocation)

谁能帮助我告诉clang如何使用正确的库函数来正确编译测试?请

现在我作为osx程序员的初学者也遇到了这个问题,答案下面神秘的1行对我没有帮助

在经历了几个令人沮丧的小时,安装并重新编译了boost之后,我终于发现了如何做到这一点

我使用一个名为MacPorts的非常有用的程序安装了boost库,该程序可在以下网址找到:

然后获取并安装boost的命令是:sudo port install boost

boost库随后出现在/opt/local/lib文件夹中

要链接,请将以下内容添加到ld链接器中的库中: -lboost\U regex-mt

请注意,实际的文件名是libboost_regex-mt.a,链接器命令行中省略了开头的“lib”,这让我在阅读手册页面之前一直感到困惑

如果您这样做,那么boost应该链接,并且undefined symbols错误应该消失


我希望这能有所帮助。

现在,作为一名osx程序员,我也遇到了这个问题,答案下面神秘的1行对我没有帮助

在经历了几个令人沮丧的小时,安装并重新编译了boost之后,我终于发现了如何做到这一点

我使用一个名为MacPorts的非常有用的程序安装了boost库,该程序可在以下网址找到:

然后获取并安装boost的命令是:sudo port install boost

boost库随后出现在/opt/local/lib文件夹中

要链接,请将以下内容添加到ld链接器中的库中: -lboost\U regex-mt

请注意,实际的文件名是libboost_regex-mt.a,链接器命令行中省略了开头的“lib”,这让我在阅读手册页面之前一直感到困惑

如果您这样做,那么boost应该链接,并且undefined symbols错误应该消失


我希望这有帮助。

< P>这个问题可能不得不用C++标准库来使用。 不久前,苹果公司默认使用libstdc++(GNU版本)改用libc++(Clang版本)。基本上有两种解决方法:

1) 确保您使用的boost库也使用libc++

2) 重写此默认值,并改用libstdc++

由于苹果公司决定改用叮当,从长远来看,它可能是最实际的。 您可以通过使用以下命令构建boost库来实现这一点:

$ ./bootstrap  --prefix=... 
$ ./b2  toolset=clang  cxxflags="-stdlib=libc++"  linkflags="-stdlib=libc++"   link=static install
当然,我不知道您的引导选项,您对b2的选项可能会有所不同,例如,您可能希望省略'link=static',您可能会提供其他编译器或链接器标志,但这应该会让您大致了解


如果要选择选项2)并使用XCode,可以转到项目的“构建设置”,然后在“C++标准库”下选择libstdc++而不是libc++。或者如果你不使用XCODE,那么就从命令行中做等价物。

< P>这个问题可能不得不用C++标准库来使用。 不久前,苹果公司默认使用libstdc++(GNU版本)改用libc++(Clang版本)。基本上有两种解决方法:

1) 确保您使用的boost库也使用libc++

2) 重写此默认值,并改用libstdc++

由于苹果公司决定改用叮当,从长远来看,它可能是最实际的。 您可以通过使用以下命令构建boost库来实现这一点:

$ ./bootstrap  --prefix=... 
$ ./b2  toolset=clang  cxxflags="-stdlib=libc++"  linkflags="-stdlib=libc++"   link=static install
当然,我不知道您的引导选项,您对b2的选项可能会有所不同,例如,您可能希望省略'link=static',您可能会提供其他编译器或链接器标志,但这应该会让您大致了解


如果要选择选项2)并使用XCode,可以转到项目的“构建设置”,然后在“C++标准库”下选择libstdc++而不是libc++。如果不使用XCode,也可以从命令行执行类似操作。

很抱歉打扰大家,只需添加-lboost\u regex-clang-darwin42-mt-1\u 54即可。我应该更小心一点。很抱歉打扰你们,只需添加-lboost_regex-clang-darwin42-mt-1_54就行了。我本应该更小心的。