未定义的引用`__stack_chk_fail'

时间:2010-12-20 18:49:10

标签: c++ gcc undefined-reference

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

undefined reference to `__stack_chk_fail'

已经尝试过选项:

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

    /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 个答案:

答案 0 :(得分:30)

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

有些事情会浮现在脑海中:

  1. 链接时添加 -fno-stack-protector 。这将确保libssp被链接。
  2. 手动关联 -lssp
  3. 在其自己的目标文件中创建__stack_chk_fail(void)的虚拟版本,并将此.o文件添加到链接器命令 AFTER libgurobi_c ++。 GCC / G ++在链接期间从左到右解析符号,所以尽管你的代码定义了函数,但是包含__stack_chk_fail符号的对象的副本需要位于libgurobi_c ++右边的链接器行上.a。

答案 1 :(得分:0)

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

表示:

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

的结果

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

答案 2 :(得分:0)

在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

答案 3 :(得分:0)

遇到了同样的问题:无效__stack_chk_fail(void)实现的c ++代码在编译时显示多个undefined reference to __stack_chk_fail错误。

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

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

这抑制了编译错误:)

希望有帮助!