2010-12-20 170 views
20

得到这个错误在编译C++代码:未定义的参考`__stack_chk_fail”

undefined reference to `__stack_chk_fail' 

选项已经尝试过:

  1. 添加-fno堆栈保护器在编译时 - 没有工作,错误仍然存​​在
  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个。

任何帮助,请?

回答

25

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

有几件事情浮现在脑海中:

  1. 链接时增添-fno-堆栈保护。这将确保libssp被链接。
  2. 手动链接-lssp
  3. 在它自己的目标文件让您__stack_chk_fail(无效)的虚拟版本,这.o文件将添加到您的链接器命令 libgurobi_C++。一。 GCC/G ++在链接过程中从左向右解析符号,所以尽管代码定义了函数,但包含__stack_chk_fail符号的对象的副本需要位于libgurobi_C++右侧的链接器行上。
+0

1.我又增加了-fno堆栈保护器早些时候,但没有帮助。 2.非常感谢,添加-lssp工作。 3.非常感谢!这些信息很有用。我已经忘记了这一点。 – Akhil 2010-12-20 19:06:57

+1

很高兴解决了它。在链接过程中是否添加了-fno-stack-protector?也许它把-lssp放错了顺序,谁知道...... – gravitron 2010-12-20 19:15:48

+1

虽然编译时运行程序时出现此错误: ./jetAlloc:加载共享库时出错:libssp.so.0:无法打开共享目标文件:无此文件或目录 – Akhil 2010-12-22 00:21:33

0

在gentoo我有同样的问题,我解决了创建2个文件。第一个包含由出现解析选项,并传递给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