referensi tidak terdefinisi ke sync_fetch_and_add_4

Setiap kali saya mencoba menggunakan __sync_fetch_and_add dengan -m32 pada mesin 64 bit, saya mendapatkan kesalahan berikut, sementara itu dikompilasi dengan baik dengan 64 bit normal. Saya menggunakan kompiler gcc 4.1.2. Apa masalahnya di sini dan apa solusinya?

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

person MetallicPriest    schedule 03.11.2011    source sumber


Jawaban (3)


Menggunakan tanda -march=i486 berhasil bagi saya.

person MetallicPriest    schedule 03.11.2011
comment
Tidak membantu saya saat melakukan kompilasi silang ke ARM dengan rantai alat yang tidak dapat saya bangun kembali 8( - person Victor Sergienko; 29.04.2016

Coba gunakan kompiler GCC yang lebih baru (misalnya GCC 4.6). Saya mencoba mengkompilasi dengan gcc -S -O3 -m32 -fverbose-asm sync-3.c file pengujian gcc/testsuite/gcc.c-torture/compile/sync-3.c dan berhasil. gcc saya (di Debian/Sid/AMD64) adalah kompiler sistem gcc 4.6.2.

person Basile Starynkevitch    schedule 03.11.2011
comment
Menggunakan gcc versi terbaru bukanlah suatu pilihan karena saya tidak memiliki hak administratif pada sistem yang saya kerjakan. - person MetallicPriest; 03.11.2011
comment
Anda tidak perlu menjadi root untuk membangun dan menginstal kompiler yang lebih baru. Anda dapat ../gcc-4.6.2/configure dengan --prefix=$HOME/pub --program-suffix=-my4.6.2, dll. Setelah instalasi, gunakan melalui gcc-my4.6.2 dengan asumsi $HOME/pub/bin ada di $PATH Anda. - person Basile Starynkevitch; 03.11.2011

hahaha! ada 5+ "lib atom standar" (+ dukungan kernel) yang bukan atom ic jika Anda bertanya kepada saya. tapi abaikan saja, itu semua hanyalah pengalih perhatian.

jadi bangunan Anda, yaitu glibc dan dapatkan kesalahan itu (saya melakukannya)

glibc-2.11.x mengharapkan gcc-4.4.x untuk mendefinisikannya secara internal, dan Anda memiliki gcc sans bu ilt-in atom, kemungkinan besar Anda tidak menentukan arch yang diterima gcc (karena kurangnya arahan). apakah glibc menyukai 786, gcc menginginkan 386 dan angka 786 mungkin. gunakan "asli" harus melakukannya. opt(march) dan opt(mtune) ADALAH NON OPSIONAL pembuatan gcc salah tanpa keduanya (kemungkinan)

Anda tidak akan menemukan header atau libfoo yang mendefinisikannya (per kata)

untuk linux-gnu yang mungkin Anda gunakan (sederhana untuk 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

PENTING: jika Anda membuat gcc tanpa mtune march right, gcc tidak akan mendefinisikan sync_fetch_and_add (p.s. glibc sync_fetch_and_add_4 hanyalah makro untuk sync_fetch_and_add yang, sekali lagi, ekspektasi glibc sudah ditentukan)

juga jika Anda mengganti gcc-3.foo dengan gcc-4.4.foo dan sedang melakukan kompilasi, Anda mungkin memerlukan:

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

saya baru membutuhkan ini (newgnu) untuk membangun 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
  • terima kasih orang di Belanda untuk posting --std yang mungkin menjadi masalah bagi pemutakhiran gcc!

  • tidak, terima kasih kepada komite yang terus berubah dan juga membuat "standar" yang membuat masalah tergantung di gcc :( gunakan .h atau .c dengan tepat untuk foo "bawaan" untuk menambahkan fitur yang Anda inginkan dalam kode Anda seperti orang lain !!

selamat bersenang-senang :)

person toey knuwho    schedule 28.12.2014