未定义对 sync_fetch_and_add_4 的引用

Posted

技术标签:

【中文标题】未定义对 sync_fetch_and_add_4 的引用【英文标题】:undefined reference to sync_fetch_and_add_4 【发布时间】:2011-12-21 03:08:59 【问题描述】:

每当我尝试在 64 位机器上将 __sync_fetch_and_add 与 -m32 一起使用时,我都会收到以下错误,而它在正常的 64 位机器上编译得很好。我正在使用 gcc 编译器 4.1.2。这里可能是什么问题,解决方案是什么?

replication.cpp:(.text+0xb3b): undefined reference to `__sync_fetch_and_add_4'
replication.cpp:(.text+0xb82): undefined reference to `__sync_fetch_and_add_4'
replication.cpp:(.text+0xcc2): undefined reference to `__sync_fetch_and_add_4'
/tmp/cc7u9FLV.o: In function `potential_barrier_leader(unsigned int, pthread_barrier_t*)':
replication.cpp:(.text+0xd3f): undefined reference to `__sync_fetch_and_add_4'
replication.cpp:(.text+0xd54): undefined reference to `__sync_fetch_and_add_4'
/tmp/cc7u9FLV.o:replication.cpp:(.text+0xdb0): more undefined references to `__sync_fetch_and_add_4' follow
collect2: ld returned 1 exit status
make: *** [all] Error 1

【问题讨论】:

【参考方案1】:

使用 -march=i486 标志对我有用。

【讨论】:

在使用无法重建的工具链交叉编译到 ARM 时没有帮助 8(【参考方案2】:

尝试使用更新的 GCC 编译器(例如 GCC 4.6)。我尝试使用gcc -S -O3 -m32 -fverbose-asm sync-3.c 编译测试文件gcc/testsuite/gcc.c-torture/compile/sync-3.c,它可以工作。我的gcc(在 Debian/Sid/AMD64 上)是系统 gcc 4.6.2 编译器。

【讨论】:

使用较新版本的 gcc 不是一种选择,因为我对正在使用的系统没有管理权限。 您无需成为 root 即可构建和安装更新的编译器。您可以使用../gcc-4.6.2/configure--prefix=$HOME/pub --program-suffix=-my4.6.2 等。安装后,通过gcc-my4.6.2 使用它,假设$HOME/pub/bin 在您的$PATH 中。【参考方案3】:

哈哈哈!有 5 个以上的“标准原子库”(+内核支持)几乎不是原子的 如果你问我的话。但忽略它,都是适时的分心。

所以你的建筑,即 glibc 并得到那个错误(我做到了)

glibc-2.11.x 期望 gcc-4.4.x 在内部定义它,而你有 gcc sans bu ilt-in atomic,可能你没有指定 gcc 接受的 arch(由于缺乏可怕的 行动)。 glibc 喜欢 786,gcc 想要 386,数字可能是 786。使用“本机 e" 应该这样做。 opt(march) 和 opt(mtune) 不是可选的 gcc 构建错误 w/ o 他们(可能)

您不会找到定义它的标头或 libfoo(按说)

对于你可能会使用的 linux-gnu(一个简单的 moi 构建)

cd gcc-4.4.foo
./configure --with-glibc-version=2.11 --enable-threads=posix \
--disable-cloog --disable-ppl --disable-libssp --enable-__cxa_atexit \
--disable-rpath --disable-nls --disable-bootstrp --disable-multilib \
--with-system-libunwind

重要提示:如果您构建 gcc w/o mtune march 正确,gcc 不会定义 sync_fetch_and_add (ps glibc sync_fetch_and_add_4 只是 sync_fetch_and_add 的宏,又 中,glibc 期望被定义)

如果你用 gcc-4.4.foo 替换 gcc-3.foo 并且正在编译你可能需要:

[ -n "$newgnu" ] && CFLAGS="$CFLAGS -march=native -mtune=native "
[ -n "$newgnu" ] && \
CFLAGS="$CFLAGS -std=gnu89 " && CPPFLAGS="$CPPFLAGS -std=gnu89 "

我新需要这个 (newgnu) 来构建 binutils-ver/: -Wstrict-aliasing=0

cd glibc-2.foo/
./configure  --with-headers=/usr/src/linux/usr/include \
--enable-kernel=2.2.foo \
--disable-profile --disable-sanity-checks --with-tls \
--disable-rpath --disable-nls

感谢荷兰人发布 --std 这可能是 gcc 升级者的问题!

1234563 !

玩得开心:)

【讨论】:

【参考方案4】:

对于旧的 GCC 版本(例如 4.5),在使用 g++ 驱动程序而不是 gcc 链接共享库时,您可能会遇到 __sync_fetch_and_add() 未声明的问题。

背景:__sync_fetch_and_add 在静态 libgcc 中定义,而在共享库 libgcc_s 中缺失。

所以简单地添加 -lgcc 可能会解决问题。但是有一个更优雅的解决方案。

查看此处了解完整信息和解决方法:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=46563

【讨论】:

以上是关于未定义对 sync_fetch_and_add_4 的引用的主要内容,如果未能解决你的问题,请参考以下文章

libpng16.so.16:未定义对“inflateReset2@ZLIB_1.2.3.4”的引用

atomic

对符号“sem_close@@GLIBC_2.2.5”的未定义引用

错误: - 未定义引用 `_imp__GetStockObject@4' 和未定义引用 `_imp__SetBkMode@8'

对静态类成员的未定义引用

对静态类成员的未定义引用