我已经使用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使用正确的库函数来正确编译测试?请
答案 0 :(得分:1)
现在我作为一名初学者,osx程序员也遇到了这个问题,而答案下方隐藏的1行并没有帮助我。
经过几个令人沮丧的时间,安装和重新编译后,我终于找到了如何做到这一点。
我使用名为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应链接,未定义的符号错误应该消失。
我希望这会有所帮助。
答案 1 :(得分: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
我当然不知道你的bootstrap选项,你对b2的选择可能会有所不同,例如,你可能想要省略'link = static',你可能会提供其他编译器或链接器标志,但是这应该给你一般的想法。
如果你想使用选项2)并且正在使用XCode,你可以转到项目的“构建设置”,在“C ++标准库”下,选择libstdc ++而不是libc ++。或者,如果您不使用XCode,请从命令行执行等效操作。