c++ - 编译时未定义对 `__sync_val_compare_and_swap_4' 错误的引用,使用 gcc 4.1.1 和 4.2.0 作为 Sparc v8 目标

标签 c++ c gcc cross-compiling sparc

使用 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)

我有必要在我的程序中使用与 Atomic-Builtins 相关的 __sync_val_compare_and_swap 函数, 它支持 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)不支持此功能?我尝试编译我的另一个程序 - 一切正常(编译并执行)。

最佳答案

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

关于c++ - 编译时未定义对 `__sync_val_compare_and_swap_4' 错误的引用,使用 gcc 4.1.1 和 4.2.0 作为 Sparc v8 目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9329020/

相关文章:

c - 指向 ANSI C 中定义的空指针的指针吗?

gcc - 如何在 CMake 项目中将全局文件扩展名 (*.pde) 添加到 GCC,它被视为 C++ 代码

c++ - Visual Studio 2013 专业版 - "An item with the same key has already been added."

c++ - Ubuntu 中的 OpenCV 不显示窗口

c - 如何在退出程序前开始计时 5 秒?

c++ - 如何在实践中解决项目编译中链接库的顺序

mysql - 针对 mysql-connector-c/libmysqlclient/mysql C API 构建应用程序时的链接器警告

c++ - 使用不同的类类型重复 Boost 单元测试

c++ - 谁能帮我解决以下编译错误——关于数组的两个实现?

c - 函数宏问题