11

ああ、私は GCC と MAC と Makefile の初心者です。今日、私は MAC OS X と GCC 4.4.2 を使用して動的ライブラリを構築するつもりでしたが、.o ファイルをリンクすると、コンパイラは次のように文句を言います:

Undefined symbols:
  "___emutls_get_address", referenced from:
      _malloc in michael.o
      _malloc in michael.o
ld: symbol(s) not found

この情報をグーグルで検索しましたが、結果がよくわかりません。シンボルが何を意味するのか、なぜ多くのプログラムでこのリンクエラーが発生するのか疑問に思います。また、このエラーの考えられる原因は何だろうかと思います。リンク コマンドは次のとおりです。

g++ -Dx86 -D_GNU_SOURCE -D_REENTRANT  -Wall -m32 \
    -fno-strict-aliasing -fno-pic -O3 -ggdb \
    michael.o malloc_new.o -o libmichael.so \
    -lpthread -lm -lstdc++  -shared
4

1 に答える 1

9

このシンボルは、Mac Os X 用の gcc による TLS (スレッドローカル ストレージ) エミュレーションの一部です。これに関する gcc bugzillaにはいくつかのバグがあります。39888

Darwin でスレッド ローカル ストレージ (OpenMP ThreadPrivate 変数など) を使用するには、-lgcc_s.so.1 または -lgcc_eh のいずれかを使用して、TLS emutl に手動でリンクする必要があります。

スレッドを参照してください: http://gcc.gnu.org/ml/gcc/2008-12/msg00145.html http://gcc.gnu.org/ml/gcc/2008-12/msg00107.html

上記のスレッドから、これは明らかにかなり混乱しています。しかし、私はこれにちょっとしたので、問題を追跡するバグがあると便利だと思っていました.

...

上記のように gcc_s.so.1 または gcc_eh に手動でリンクすると、TLS は正常に動作します。

したがって、考えられる解決策の 1 つは、リンク ステップに追加 -lgcc_s.so.1または-lgcc_ehオプションを追加することです。もう 1 つは、gcc のバグであるため、gcc を更新することです。

于 2011-10-25T06:07:06.720 に答える