C++ 未定义对“同步值比较”和“交换4'”的引用;编译时出错,对Sparc v8目标使用gcc 4.1.1和4.2.0
使用我在以下编译器gcc-4.1.1和4.2.0 20061024(预发布)下为Sparc体系结构构建的脚本:C++ 未定义对“同步值比较”和“交换4'”的引用;编译时出错,对Sparc v8目标使用gcc 4.1.1和4.2.0,c++,c,gcc,cross-compiling,sparc,C++,C,Gcc,Cross Compiling,Sparc,使用我在以下编译器gcc-4.1.1和4.2.0 20061024(预发布)下为Sparc体系结构构建的脚本: $ ./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
$ ./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
及
我有必要在我的程序中使用与相关的功能,该功能支持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体系结构(Sparc v8)不支持此功能?我试着编译我的另一个程序-都很好(编译并执行)。如这里所述:
\uuuu sync\u val\u compare\u和\u swap
在某些目标上会导致函数调用(直接代码生成不可用或尚未实现)。你的情况就是这样。假设它本身对您来说不是问题,那么您需要链接定义\u sync\u val\u compare\u和\u swap\u 4
和朋友的库,我猜是这样(因此将-lgcc\u s
添加到您的链接行中)。看起来有一个相关的gcc错误:
也许可以试试新的gcc?在ARMv5平台上编译NodeJS(基于V8引擎)时,我遇到了类似的问题 基本上说,您的GCC没有此内置函数,这可能是因为您使用的是旧版本,或者这些函数尚未在您的平台上实现,因此“-lgcc_s”甚至可能没有帮助 在谷歌搜索了几个小时后,我发现了这个博客页面(),它非常清楚地解释了原因并给出了解决方案: 从GCC代码中获取具有这些函数的平台源代码,将代码构建到库中,安装它,然后将应用程序链接到此库 我没有遵循这个博客中描述的确切程序,但想法是一样的,而且它是有效的
希望有帮助。在Android上,我可以通过以下标志解决问题 本地\u CFLAGS+=-O3-fopenmp
LOCAL_LDFLAGS+=-O3-fopenmp-lgcc-latomic-lgomp对于我来说,上面的失败意味着“您正在使用gcc/mingw交叉编译器,所以-march=native不起作用”(我猜)。请参阅(基本上可以通过手动指定-march设置来解决此问题)。添加-lgcc_s:$。/sparc unknown linux gnu gcc test_cas.c-lgcc_s-o test_cas对我没有帮助。同样的错误。但我尝试查找文本“\uuuu sync\u val\u compare\u and\u swap\u 4”,结果是以下文件:sparc unknown linux gnu\bits\stdc++.h.gch\O0g.gch,sparc unknown linux gnu\bits\stdc++.h.gch\O2g.gch,gcc\builtins.def,cc1.exe,cc1plus.exe等。您必须在输出后放置库链接:
/sparc unknown linux gnu gcc test\u cas.c-o test\u cas-lgcc\s
如何在跨目标的/usr/lib
中的所有库上运行nm
或objdump
,并对该函数进行重新映射?我试图找到并得到以下结果:$nm-A*|grep\uuuu sync\u val\u compare\u and\u swap\u 4 nm:libc.so:文件格式无法识别nm:libpthread.so:文件格式无法识别这可能是链接器脚本或其他文件,而不是实际的共享库。libgcc_.so应该包含在gcc中,不太可能出现在/lib或/usr/lib中(而是出现在/usr/lib/gcc/[target]/[version]/,或类似的内容中)。检查以确保libgcc_.so存在;有时发行版会错过创建到实际库的符号链接(可能是libgccs.so.1)。当然,除了.so,还要检查.a;它可能只作为一个静态库提供。你不认为你可以发布你是如何让NodeJ工作的吗?我现在正面临着这个问题。最后,我在10.04 ubuntu上根据你的建议解决了这个问题。非常感谢。
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