在编译时未定义引用`__sync_val_compare_and_swap_4’错误,使用gcc 4.1.1和4.2.0对Sparc v8目标

使用crosstool脚本我在Cygwin下构建了Sparc架构的以下编译器gcc-4.1.1和4.2.0 20061024(预发行版):

$ ./sparc-unknown-linux-gnu-gcc -v Using built-in specs. Target: sparc-unknown-linux-gnu Configured with: /crosstool-0.43/build/sparc-unknown-linux-gnu/gcc-4.1.1-glibc-2.3.6/gcc-4.1.1/configure --target=sparc-unknown-linux-gnu --host=i686-host_pc-cygwin --prefix=/opt/crosstool/gcc-4.1.1-glibc-2.3.6/sparc-unknown-linux-gnu --with-headers=/opt/crosstool/gcc-4.1.1-glibc-2.3.6/sparc-unknown-linux-gnu/sparc-unknown-linux-gnu/include --with-local-prefix=/opt/crosstool/gcc-4.1.1-glibc-2.3.6/sparc-unknown-linux-gnu/sparc-unknown-linux-gnu --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atexit --enable-languages=c,c++ --enable-shared --enable-c99 --enable-long-long Thread model: posix gcc version 4.1.1 

 $ ./sparc-unknown-linux-gnu-gcc -v Using built-in specs. Target: sparc-unknown-linux-gnu Configured with: /crosstool-0.43/build/sparc-unknown-linux-gnu/gcc-4.2-20061024- glibc-2.3.6/gcc-4.2-20061024/configure --target=sparc-unknown-linux-gnu --host=i 686-host_pc-cygwin --prefix=/opt/crosstool/gcc-4.2-20061024-glibc-2.3.6/sparc-un known-linux-gnu --with-headers=/opt/crosstool/gcc-4.2-20061024-glibc-2.3.6/sparc -unknown-linux-gnu/sparc-unknown-linux-gnu/include --with-local-prefix=/opt/cros stool/gcc-4.2-20061024-glibc-2.3.6/sparc-unknown-linux-gnu/sparc-unknown-linux-g nu --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atex it --enable-languages=c,c++ --enable-shared --enable-c99 --enable-long-long Thread model: posix gcc version 4.2.0 20061024 (prerelease) 

对我来说,我可以在我的程序中使用__sync_val_compare_and_swap与Atomic- __sync_val_compare_and_swap相关的函数,它支持whith 4.1。*版本的gcc。

我尝试编译简单的C代码:

 long cmpxchg( long* value, long comp_val, long new_val ) { return __sync_val_compare_and_swap( value, comp_val, new_val ); } int main() { return 0; } 

但我有以下错误:(在两个编译器上):

 $ ./sparc-unknown-linux-gnu-gcc test_cas.c -o test_cas /tmp/ccREXHsP.o: In function `cmpxchg': test_cas.c:(.text+0x24): undefined reference to `__sync_val_compare_and_swap_4' collect2: ld returned 1 exit status 

有什么问题? 可能是我错误的编译器? 可能是Sparc架构(SPARC v8)不支持这个function吗? 我试图编译我的另一个程序 – 一切都很好(编译和执行)。

如下所述:某些目标上的http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html __sync_val_compare_and_swap将导致函数调用(直接代码生成不可用或尚未生成实现)。 这种情况正在你的情况下发生。 假设它本身不是你的问题,那么你需要链接定义__sync_val_compare_and_swap_4和朋友的库,我猜测它是libgcc_s (所以将-lgcc_s添加到你的链接行)。

看起来有一个相关的gcc bug:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40134

也许尝试更新的gcc?

在ARMv5平台上编译NodeJS(基于V8引擎)时,我遇到了类似的问题。

基本上,你的GCC没有这个内置函数,要么是因为你使用的是旧版本,要么这些函数还没有在你的平台上实现,所以“-lgcc_s”甚至可能无济于事。

在谷歌工作了几个小时之后,我找到了这个博客页面( http://vincesoft.blogspot.fr/2012/04/how-to-solve-undefined-reference-to.html ),它解释了原因相当清楚并给出了解决方案:

使用GCC代码中的这些函数获取平台的源代码,将代码构建到库中,安装它,然后将应用程序链接到此库。

我没有遵循本博客中描述的确切程序,但这个想法是一样的,并且它有效。

希望能帮助到你。

在Android上我能用以下标志解决问题LOCAL_CFLAGS + = -O3 -fopenmp LOCAL_LDFLAGS + = -O3 -fopenmp -lgcc -latomic -lgomp

对我来说,上面的失败意味着“你正在使用gcc / mingw交叉编译器,所以-march = native不起作用”(我猜)。 请参阅https://stackoverflow.com/a/24213278/32453 (基本上您可以通过手动指定-march设置来解决它)。