哦,我是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
答案 0 :(得分:5)
此符号是gcc for Mac Os X的TLS(线程局部存储)仿真的一部分.gcc bugzilla中有一些关于此的错误,例如:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39888
在Darwin上使用线程本地存储(例如OpenMP ThreadPrivate变量) 需要手动链接到TLS emutls,通过-lgcc_s.so.1或-lgcc_eh
查看主题: http://gcc.gnu.org/ml/gcc/2008-12/msg00145.html http://gcc.gnu.org/ml/gcc/2008-12/msg00107.html
从上面的主题来看,这显然是一团糟。但是,就像我一样 我希望有一个跟踪问题的bug很有用。
...
如果我手动链接到gcc_s.so.1或gcc_eh,TLS工作正常。
因此,可能的解决方案之一是在链接步骤中添加-lgcc_s.so.1
或-lgcc_eh
选项。还有一个是更新你的gcc,因为这是gcc的错误。