Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 未定义对“同步值比较”和“交换4'”的引用;编译时出错,对Sparc v8目标使用gcc 4.1.1和4.2.0_C++_C_Gcc_Cross Compiling_Sparc - Fatal编程技术网

C++ 未定义对“同步值比较”和“交换4'”的引用;编译时出错,对Sparc v8目标使用gcc 4.1.1和4.2.0

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

使用我在以下编译器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 --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