未定义对 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”的引用
对符号“sem_close@@GLIBC_2.2.5”的未定义引用
错误: - 未定义引用 `_imp__GetStockObject@4' 和未定义引用 `_imp__SetBkMode@8'