2010-12-20 40 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