2014-12-22 28 views
5

için Tanımsız semboller Birden alt dizinleri olan bir uygulama yazıyorum. Makefile yapısı oluşturdum, böylece alt dizinler dosyayı derler ve bağlantı için ana dizine arşivler oluşturmak için "ar rvs" ve "ranlib libxxx.a" yaparlar. gcc: mimari x86_64

Ancak "ld" komutu aşağıdaki sorun haline çalışıyor. Ben Mac OS X üzerinde gcc kullanıyorum

ld: warning: ignoring file ./libxxx.a, file was built for archive which is not 
the architecture being linked (x86_64): 
./libxxx.a Undefined symbols for architecture x86_64: 

10.10.1

Bu konuda birçok mesajları okuyun. Ben, o zaman ben gcc-4.9.2 yüklü ve hiçbir şans ile varsayılan gcc'nin yerine kullanmaya çalıştı

Undefined symbols for architecture i386: 

i386 için aynı hatayla karşılaşırsanız "-ARCH i386 gcc" çalıştı. X86_64-apple-darwin14.0.0-g ++ - 4.9.2 kullanmayı denedim ve bu da işe yaramadı.

cevap

1

Eğer yapı içinde i386 ve x86_64 kodunun karışımı varsa ve tutarlı olması gerektiğini ortalama görüyoruz hataları. Aksini yapmak için zorlayıcı bir sebep olmadıkça (ne olduğunu bilmek isterdim), sadece 64-bit için her şeyi derlemelisiniz. Mac'te gcc'u kullanarak, bu normalde varsayılandır, ancak derlemelere bir -m64 bayrağı ekleyerek zorlayabilirsiniz. Bunu yapmanın bir yolu, make komut satırında CC="gcc -m64" ayarlamaktır; başka daha iyi yollar da var, ancak detaylar makefile içeriğinize bağlıdır.

Çözümlemek için: önce, proje alanında oluşturduğunuz tüm kitaplıkları ve nesne kodunu kaldırın (belki de bunu yapar - bir clean hedefi yazdıysanız). Sonra, (sonuçta CFLAGS, ama nasıl CFLAGS inşa edilmiştir makefile bağlıdır) CC veya bayrakların değerini Fettle 64 bit derleme zorlanan böylece. Daha sonra bunu tüm derlemelerde kullandığınızdan emin olun. -m64 göremiyorsanız, bir sorun var. Eğer 32-bit kullanmanız gerekiyorsa

, -m64 için -m32 yerine.

tartışma Yukarıdaki ld komutu çalıştırmak için gcc kullandığınızı varsayar. Eğer değilseniz, ld komutunu çalıştırmak için gcc'u kullanana kadar kendi başınıza kalırsınız. Benim görüşüme göre, ld komutunu nasıl doğru bir şekilde çalıştıracağımıza göre hayatınızla ilgili daha iyi şeyler var; Bende kesinlikle var.

+0

Yanıt için teşekkür ederiz. Ben "CC = gcc -m64" denedim ve ayrıca ld komutunu çalıştırmak için gcc kullandım.Ama sonuç aynı. Ben sadece tutarlı - eğer başka bir sebepten dolayı yaparsam çalışıp çalışmadığını görmek için -m32 seçeneğini denedim. – newprogrammer

+0

Sorunu yeniden üreten minimal bir makefile rastlamadıkça kimse size daha fazla yardımcı olamaz. Bir MCVE ([Minimal, Tam ve Doğrulanabilir Örnek Nasıl Oluşturulur?] (Http://stackoverflow.com/help/mcve) veya SSCCE (Kısa, Kendinden İçeren, Doğru Örnek) oluşturma hakkında bilgi edinin. (http://sscce.org/)) - aynı fikir için iki isim ve bağlantı. MCVE kodunuz muhtemelen kütüphane için bir minimum kaynak dosya (ve başlık) olmalıdır (void libfunc (void) {printf ("% s adlı \ n", __func__);), ve ana program kütüphane işlevini çağırır. artı bir ya da iki makefile işlerin nasıl yapıldığına bağlı olarak, –

+0

Teşekkür ederim. – newprogrammer