ile 16 bayt CAS kullanırken Tanımsız başvuru bağlayıcı hatası, Debian üzerinde GCC 4.7.2 kullanıyorum ve 16 baytlık değerleri olan <atomic>
olanaklarını kullanmaya çalıştığımda bağlayıcı hataları alıyorum. CMPXCHG16B
talimatını destekleyebilen bir x86_64 VM çalıştırıyorum - ancak gerekli donanıma sahip olmasam bile, burada neden bir linker hatasının üretileceğini anlamıyorum. Bildiğim kadarıyla, <atomic>
kütüphanesinin donanımın gerekli CAS operasyonunu desteklememesi durumunda normal kilitleri kullanarak geri düşmesi bekleniyor. Bu derleme yaparkenGCC
#include <atomic>
#include <cstdint>
struct foo
{
std::uint64_t x;
std::uint64_t y;
};
int main()
{
std::atomic<foo> f1({0,0});
foo f2 = {0,0};
foo f3 = {1,1};
f1.compare_exchange_strong(f2, f3);
}
, alıyorum:: Ben programı değiştirmek eğer foo
böylece o
# g++ test.cpp -o test -std=c++11 -g3
/tmp/ccziKZis.o: In function `std::atomic<foo>::compare_exchange_strong(foo&, foo, std::memory_order, std::memory_order)':
/usr/include/c++/4.7/atomic:259: undefined reference to `__atomic_compare_exchange_16'
collect2: error: ld returned 1 exit status
Not
Neyse, burada bu sorunu yeniden oluşturmak için çok basit bir test durumu var sadece 8 bayt, bağlayıcı hatası almıyorum. Burada neler oluyor?
İlginç, 4.8.2 ve clang ++ 3.6 g ++ ile bu üreme olabilir. Altta yatan sorunun ne olduğundan emin değil - standart kütüphanede bir hata gibi görünüyor ya da bunlardan bazıları. –