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'**

以前、私はそのようなエラーを数十回受けていました。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) のダミー バージョンを作成し、この .o ファイルを libgurobi_c++.a の後にリンカー コマンドに追加します。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"

2 つ目は、どのパッケージがこの設定を使用する必要があるかを示します。

/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 に答える
0

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

言います:

「通常、これはビルド中に gcc の代わりに ld を呼び出してリンクを実行した結果です」

これは、libjpeg の Makefile を手動で変更したときに遭遇したものです。ld の代わりに gcc を使用すると問題が解決しました。

于 2014-09-17T09:43:51.963 に答える