【问题标题】:basic_regex is an undefined symbo - Boost framework linker errorbasic_regex 是未定义的符号 - Boost 框架链接器错误
【发布时间】:2014-11-24 00:44:53
【问题描述】:

我正在使用 boost 框架测试应用程序。为此,我遵循了

github 链接并构建框架并相应地插入。我将项目属性设置如下

Language Dialect set to C++11 [-std=c++11]

C++ Standard Library set to libc++ (LLVM C++ standard library with C++11 support)

OS X deployment target 10.10

为了避免这个错误

我删除关键字寄存器 并按如下方式更改了我的代码(请找到以下附加代码的#pragma 标记),但对我没有任何作用。删除注册关键字后,我没有收到已弃用的警告。 但是无论有没有那个警告,我都会遇到链接器错误。 请帮助我解决这些错误。

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-register"

#pragma clang diagnostic pop

#include <boost/regex.hpp>
#include <iostream>
#include <string>


int main()
{
    std::string line;
    boost::regex pat( "^Subject: (Re: |Aw: )*(.*)" );

    while (std::cin)
    {
        std::getline(std::cin, line);
        boost::smatch matches;
        if (boost::regex_match(line, matches, pat))
            std::cout << matches[2] << std::endl;
    }
}

错误日志

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 main.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 main.o
      boost::re_detail::save_state_init::save_state_init(boost::re_detail::saved_state**, boost::re_detail::saved_state**) in main.o
  "boost::re_detail::put_mem_block(void*)", referenced from:
      boost::re_detail::save_state_init::~save_state_init() in main.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 main.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 main.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 main.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 main.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 main.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 main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

【问题讨论】:

  • 您能否将错误消息的实际文本添加到您的问题中?您的屏幕快照已截断了文本。
  • 您在标题中提到的错误只是一个警告。真正的错误是 basic_regex 是一个未定义的符号。您没有与图书馆链接。
  • @ThomasMatthews 我确实请找到已编辑的问题
  • @Dave 我认为这些错误是由于该警告而出现的,这就是为什么我已经发布了该错误,无论如何我已经更正了,谢谢你 :)
  • 警告不太可能与错误有关(尽管我不敢说这是不可能的)。您确定要链接到 boost regex 库吗?检查您的链接器调用,或者更好地发布它。

标签: c++ xcode boost osx-yosemite


【解决方案1】:

您需要将 boost 链接到项目中:

  1. 在您的项目导航器中找到“搜索路径”部分。
  2. 会有一个名为“图书馆搜索路径”的小节。
  3. 添加已安装的 boost 的 lib 目录,通常类似于:.../boost*/libs

请注意,在同一部分中,您应该在“标题搜索路径”下添加主 boost 目录

编辑: 您可以在此处找到入门指南:http://www.boost.org/doc/libs/1_57_0/more/getting_started/unix-variants.html

有趣的是,您会注意到default folder 结构应该是: boost_1_57_0/libs 注意缺少任何“i386”或“x86_64”。所以我很担心你的升压设置。

还要注意boost::regexheader only file。我会检查您是否在“标题搜索路径”中包含 boost_1_57_0/boost。

【讨论】:

  • 感谢您的建议。在有效架构下的项目属性中,它具有 i386 X 86_64 。在已编译的 boost 库中,我可以找到 i386 和 i86_64 两个文件夹都包含 libboost_system.a 和 libboost.a 我已添加路径为 /Users/venushka/Desktop/boost/osx/build/i386/ 和 /Users/venushka/Desktop/boost/ osx/build/x86_64/ 进入库搜索路径和标题搜索路径,但我仍然有同样的错误
  • @VenushkaT 我意识到我输入错误 .../boost/stage/lib 我已经更正并编辑了我的答案并添加了几个源链接。请看一看。
  • 你是对的,伙计。我会再次检查我的 boost 构建版本。谢谢你,我投票给你的答案。
  • 跟随您的引导后-我添加标题搜索路径-/Users/venushka/Desktop/boost/boost_1_54_0 和库搜索路径-/Users/venushka/Desktop/boost/boost_1_54_0/stage/lib 谢谢现在对你有用
  • @VenushkaT 太棒了,我很高兴它对你有用。当你真正想做的只是代码时,没有什么比尝试构建或链接更烦人的了。
猜你喜欢
  • 2014-10-19
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-04
  • 1970-01-01
相关资源
最近更新 更多