未定义的引用sync_fetch_and_add_4

每当我尝试在64位机器上使用带有-m32的__sync_fetch_and_add时,出现以下错误,而使用正常的64位编译正常。 我正在使用gcc编译器4.1.2。 这里有什么问题,解决scheme是什么?

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 

使用-march = i486国旗为我做了诡计。

尝试使用更新的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编译器。

HAHAH! 有5个“标准的原子库”(+内核支持),如果你问我,就几乎没有原子。 但忽视它,都是及时的分心。

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

glibc-2.11.x希望gcc-4.4.x能够在内部定义它,并且你有gcc sans buil-in原子,可能你没有指定gcc接受的arch(由于缺乏指令)。 是glibc喜欢786,海湾合作委员会希望386和数字786也许。 使用“nativ e”应该这样做。 选择(3月)和选择(mtune)是不可选的gcc构建错误瓦特/他们(可能)

你不会找到一个头文件或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期望的aga中被定义)

另外如果你用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的问题:(使用.h或者.c适当地为“内建”添加你想要的代码就像其他人一样!

玩的开心 :)