35

编译 C++ 代码时出现此错误:

undefined reference to `__stack_chk_fail'

已经尝试过的选项:

  1. 编译时添加了 -fno-stack-protector - 不起作用,错误仍然存​​在
  2. 在我的代码中添加了 void __stack_chk_fail(void) 的虚拟实现。仍然得到同样的错误。

详细错误:

/u/ac/alanger/gurobi/gurobi400/linux64/lib/libgurobi_c++.a(Env.o)(.text+0x1034): In function `GRBEnv::getPar/u/ac/alanger/gurobi/gurobi400/linux64/lib/libgurobi_c++.a(Env.o)(.text+0x1034): In function `GRBEnv::getParamInfo(GRB_StringParam, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)':
: undefined reference to `__stack_chk_fail'
amInfo(GRB_StringParam, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)':
: **undefined reference to `__stack_chk_fail'**

早些时候,我收到了 10 个这样的错误。发现gcc我正在使用的预编译库与gcc我用于编译代码的版本之间存在版本不匹配。已更新gcc,现在我只收到其中 2 个错误。

请问有什么帮助吗?

4

4 回答 4

39

libgurobi_c++.a 是用 -fno-stack-protector 编译的(显然)。

我想到了几件事:

  1. 链接时添加-fstack-protector。这将确保 libssp 得到链接。
  2. 手动链接-lssp
  3. 在它自己的目标文件中制作 __stack_chk_fail(void) 的虚拟版本,然后在libgurobi_c++.a之后将此 .o 文件添加到链接器命令中。GCC/G++ 在链接期间从左到右解析符号,因此尽管您的代码定义了函数,但包含 __stack_chk_fail 符号的对象的副本需要位于 libgurobi_c++.a 右侧的链接器行。
于 2010-12-20T18:58:31.513 回答
1

在gentoo中我遇到了同样的问题,我解决了创建2个文件。第一个包含要被emerge解析并传递给gcc的选项:

/etc/portage/env/nostackprotector.conf
CFLAGS="-fno-stack-protector -O2"

第二个告诉哪个包应该使用这个设置:

/etc/portage/package.env/nostackprotector
x11-libs/vte nostackprotector.conf
sys-libs/glibc nostackprotector.conf
www-client/chromium nostackprotector.conf
app-admin/sudo nostackprotector.conf
于 2015-04-15T07:20:34.637 回答
1

只是遇到了同样的问题:具有 void 实现的 C++ 代码在编译时__stack_chk_fail(void)显示了几个undefined reference to __stack_chk_fail错误。

我的解决方案是定义__stack_chk_fail(void)extern "C"

extern "C" {
__stack_chk_fail(void)
{
...
}
}

这抑制了编译错误:)

希望能帮助到你!

于 2020-04-02T13:54:57.233 回答
0

https://wiki.ubuntu.com/ToolChain/CompilerFlags

说:

“通常这是在构建期间调用 ld 而不是 gcc 来执行链接的结果”

这是我手动修改libjpeg的Makefile时遇到的。使用 gcc 而不是 ld 解决了这个问题。

于 2014-09-17T09:43:51.963 回答