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

这个符号是 gcc for Mac Os X 的 TLS(线程本地存储)仿真的一部分。gcc bugzilla 中有一些关于此的错误,例如:http ://gcc.gnu.org/bugzilla/show_bug.cgi?id= 39888

在 Darwin 上使用线程本地存储(例如 OpenMP ThreadPrivate 变量)需要通过 -lgcc_s.so.1 或 -lgcc_eh 手动链接到 TLS emutls

请参阅线程: 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 工作正常。

因此,一种可能的解决方案是添加 -lgcc_s.so.1-lgcc_eh选择链接步骤。另一个是更新你的 gcc,因为这是 gcc 的错误。

于 2011-10-25T06:07:06.720 回答