1

我已经使用 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/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)

我记得在使用 gcc 编译简单的 boost 程序时使用了 -libregex 或其他东西。我已经尝试了所有组合,但它仍然给出错误提示(我的意思是 -libboost_regex-mt,libboost_atomic-clang-darwin42-mt-1_54.a ,..)

 $$ clang++ -I /usr/local/include/boost-1_54/ -L /usr/local/lib/ -o regex test_regex.cpp -libboost_regex

   ld: library not found for -libregex

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

4

2 回答 2

1

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

经过几个令人沮丧的小时以及安装和重新编译 boost,我终于找到了如何做到这一点。

我使用一个名为 MacPorts 的非常有用的程序安装了 boost 库,该程序可以在以下位置找到:http: //www.macports.org/

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

然后,boost 库会出现在文件夹 /opt/local/lib 中

要将以下内容添加到 ld 链接器中的库中:-lboost_regex-mt

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

如果你这样做,那么 boost 应该链接并且未定义的符号错误应该消失。

我希望这有帮助。

于 2013-07-26T21:21:24.400 回答
0

问题可能与正在使用的 c++ 标准库有关。前段时间,Apple 从默认使用 libstdc++(GNU 版本)切换到 libc++(Clang 版本)。基本上有两种方法可以解决这个问题:

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

2) 覆盖此默认值,并改用 libstdc++。

由于 Apple 决定改用 CLang,1) 从长远来看可能是顺其自然的最实用的方法。您可以通过使用以下命令构建 boost 库来做到这一点:

$ ./bootstrap  --prefix=... 
$ ./b2  toolset=clang  cxxflags="-stdlib=libc++"  linkflags="-stdlib=libc++"   link=static install

我当然不知道您的引导选项,并且您对 b2 的选择可能会有所不同,例如,您可能希望省略 'link=static' 并且您可以提供其他编译器或链接器标志,但这应该给出你的总体思路。

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

于 2014-02-13T09:33:38.830 回答