编译时对"__sync_val_compare_and_swap_4"错误的未定义引用,将 gcc 4.1.1 和 4.2.0 用于 Sparc v8 目标
undefined reference to `__sync_val_compare_and_swap_4' error at compilation, using gcc 4.1.1 and 4.2.0 for Sparc v8 target
使用我在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)
对我来说,有必要在我的程序中使用与Atomic Builtins相关的__sync_val_compare_and_swap
函数,它支持gcc的4.1.*版本。
我尝试编译简单的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体系结构(SPARCv8)不支持此功能?我试着编译我的另一个程序——一切都很好(编译并执行)。
如下所述:http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html某些目标上的__sync_val_compare_and_swap
将导致函数调用(其中直接代码生成不可用或尚未实现)。你的情况就是这样。假设它本身对您来说不是问题,那么您需要链接定义__sync_val_compare_and_swap_4
和friends的库,我猜它是libgcc_s(所以将-lgcc_s
添加到您的链接行中)。
看起来有一个相关的gcc错误:
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_FLAGS+=-O3-fopenmpLOCAL_LDFLAGS+=-O3-fopenmp-lgcc-latomic-lgomp
对我来说,上面的失败意味着"你使用的是gcc/mingw交叉编译器,所以-march=native不起作用"(我想)。看见https://stackoverflow.com/a/24213278/32453(基本上,您可以通过手动指定-march设置来解决它)。
- 为什么我的 SFINAE 表达式不再适用于 GCC 8.2?
- gcc 中的多个对齐属性是否可以用于保证缓存行分隔?
- 用于 OpenMP 4.5 卸载到 (GPU) 设备的 NVPTX GCC (9.0.0/trunk) 找不到 libg
- 适用于 gcc 4.8 的任何正则表达式库
- 是否有 GCC 警告,用于使用 C 库中的符号而不是通过命名空间 std?
- 流输入运算符导致分段错误与 clang 但适用于 gcc
- -static-libstdc++ 适用于 g++ 但不适用于纯 gcc?
- 如何修复lib libstdc++的"std::variant"(来自GCC 9.1)不适用于Clang 8?
- 为什么将 lambda 用于非类型模板参数时 gcc 失败?
- enable_if的模板专用化在 Clang 中失败,适用于 GCC
- 函数指针数组的类模板参数推导适用于 clang,但不适用于 gcc
- 可变参数模板作为模板参数:演绎适用于 GCC,但不适用于 Clang
- GCC是否优化STD :: TIE仅用于可读性
- 用于 c++0x 原子和线程的 GCC 标志
- 何时将-g标志用于GCC
- 从Visual Studio解决方案生成生成生成文件(用于GCC)
- -m32 选项不适用于 gcc,但适用于 g++
- 库与 Clang 合作,但不适用于 GCC
- 用于回归测试的快速 GCC 构建
- Clang vs GCC用于我的Linux开发项目