对sync_fetch_and_add_4的未定义引用

发布于 2024-12-13 11:30:34 字数 827 浏览 1 评论 0原文

每当我尝试在 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

Whenever I try to use __sync_fetch_and_add with -m32 on a 64 bit machine, I get the following error, while it compiles fine with normal 64 bit. I am using gcc compiler 4.1.2. What can be the problem here and what is the solution?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

星光不落少年眉 2024-12-20 11:30:34

使用 -march=i486 标志对我来说很有效。

Using -march=i486 flag did the trick for me.

静水深流 2024-12-20 11:30:34

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

Try using a more recent GCC compiler (e.g. GCC 4.6). I tried to compile with gcc -S -O3 -m32 -fverbose-asm sync-3.c the test file gcc/testsuite/gcc.c-torture/compile/sync-3.c and it works. My gcc (on Debian/Sid/AMD64) is the system gcc 4.6.2 compiler.

丑疤怪 2024-12-20 11:30:34

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

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

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

你不会找到

为你可能使用的 linux-gnu 定义它的头文件或 libfoo (一个简单的 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 没有 mtune 行进正确,gcc 不会定义sync_fetch_and_add
(ps glibcs​​ync_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
  • < p>感谢荷兰人发帖 --std 这可能是 gcc 升级者的问题!

  • 不,感谢委员会不断改变并创建“标准”,这些“标准”在 gcc 中产生依赖问题:(适当地使用 .h 或 .c 来表示 foo“内置”,以像其他人一样在代码中添加您想要的功能!!

! 乐趣 :)

hahah! there are 5+ "standard atomic libs" (+kernel support) that's hardly atom
ic if you ask me. but ignore it, is all a timely distraction.

so your building, ie glibc and get that error (i did)

glibc-2.11.x expects gcc-4.4.x to define it internally, and you have gcc sans bu
ilt-in atomic, likely you didnt specify arch that gcc accepts (due to lacky dire
ctions). were glibc likes 786, gcc wants 386 and figures 786 maybe. use "nativ
e" should do it. opt(march) and opt(mtune) ARE NON OPTIONAL gcc builds wrong w/
o them (likely)

you won't find a header or libfoo that defines it (per say)

for linux-gnu you might use (a simple for moi build)

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

IMPORTANT: if you build gcc w/o mtune march right, gcc wont define sync_fetch_and_add
(p.s. glibc sync_fetch_and_add_4 is just macro for sync_fetch_and_add which, aga
in, glibc expects is defined)

also if you replace gcc-3.foo with gcc-4.4.foo and are compiling you may need:

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

i newly need this (newgnu) to build 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
  • thanks guy in holland for posting --std that might be an issue for gcc upgraders !

  • no thanks to comittees continually changing and also creating "standards" that make depends problems in gcc :( use .h or .c appropriately for foo "builtin" to add features you want in your code like everyone else !!

have fun :)

荒岛晴空 2024-12-20 11:30:34

对于旧的 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

With old GCC versions (4.5 for example) you might encounter the problem of __sync_fetch_and_add() being undeclared when using the g++ driver instead of gcc for linking a shared library.

Background: __sync_fetch_and_add is defined within static libgcc and missing from shared library libgcc_s.

So simply adding -lgcc might solve the problem. But there is a more elegant solution.

See here for full information and workaround(s):
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=46563

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文