【问题标题】:Undefined symbol std::__throw_bad_function_call未定义符号 std::__throw_bad_function_call
【发布时间】:2012-10-17 20:09:19
【问题描述】:

我正在使用 g++ 在 Eclipse CDT 中构建 C++ 代码,但出现以下链接器错误:

Undefined symbols for architecture x86_64:
  "std::__throw_bad_function_call()", referenced from:
      std::function<void (graphics::RenderingContext*)>::operator()(graphics::RenderingContext*) const in GameWindow.o

我在一个名为 GameWindow 的类中有 std::function 成员。

为了让代码使用std::function 正确链接,我必须链接到什么?

【问题讨论】:

  • 我遇到了类似的问题。我在网上搜索,发现当您错过包含任何内部标题时会发生这种情况。希望这会有所帮助

标签: c++ stl linker g++


【解决方案1】:

原来我的 lib 路径没有为 g++ 正确设置。

为了后代:我使用 gcc 4.7 进行编译,因为我需要 C++11 功能。 XCode(在 OS X Mountain Lion 上)附带 gcc 4.2,所以我通过 Homebrew 安装了 gcc 4.7。

为了让 Eclipse 使用 gcc 4.7 进行编译,我必须在项目设置中更改编译器和链接器的路径以对应于通过 Homebrew 新安装的版本。但是,我的项目设置中仍然有 gcc 4.2 stdlibc++ 的旧库路径。

【讨论】:

  • 对,我在 2009 年左右添加了该功能,因此您一定是从旧 G++ 版本链接到旧的 libstdc++,它没有提供符号。如果您使用g++ 链接它应该会自动找到正确的库。
  • @JonathanWakely 到底发生了什么。当我实际编译和链接 gcc 4.7 时,我仍在链接来自 XCode 的 gcc 4.2 libstdc++。谢谢!
【解决方案2】:

如果这是您唯一的错误,为什么不尝试在自己的代码中实现该功能?类似:

namespace std {
    void __throw_bad_function_call() {throw bad_function_call("invalid function called");}
}

【讨论】:

  • 在嵌入式软件标准库中,由于库的大小,通常不使用。在这种情况下,@BigBoss 提议是一个正确的选择。 namespace std {void __throw_bad_function_call() { while(1); }; } 提供了一点开销,但允许使用 std::function 模板。
猜你喜欢
  • 2022-01-17
  • 1970-01-01
  • 2019-02-14
  • 1970-01-01
  • 1970-01-01
  • 2015-10-09
  • 2022-01-02
  • 2012-11-07
  • 2012-09-05
相关资源
最近更新 更多