2012-08-17 10 views
5

İki arşiv kütüphanesini bir C programına birleştiren ince bir arşivi bağlamaya çalışıyorum. Snow Leopard'daki ince arşive bağlantı

Ben iki basit merhaba dünya fonksiyonları inşa ve komutlarla bir arşiv inşa: İki arşivleri daha sonra, ince arşivi kullanılarak birleştirilir

ar rcs lib1.a lib1.o 
ar rcs lib2.a lib2.o 

: o zaman

ar rcsT all_lib.a lib1.a lib2.a 

ve gcc ile derlenmiş :

gcc main.o all_lib.a -o hello 

Bir hata iletisi ile biter:

ld: Uyarı: Dosya all_lib.a görmezden, dosya desteklenmeyen dosya biçimi için inşa edilmiş mimari değil birbirlerine bağlıdır (x86_64) mimarisi x86_64 için

Tanımsız sembolleri: "_func1", başvurulan: main.o ld içinde _main: Ben lib1.a ve lib2 ile main.o bağlantı çalışırsanız mimari x86_64

için bulunamadı sembolü (ler) main.o gelen başvurulan "_func2", _main. Doğrudan, her şey çalışır.

Mac OSX 10.6.8'de gcc (MacPorts gcc46 4.6.3_3) 4.6.3 ve GNU ar (GNU Binutils) 2.21 kullanıyorum.


Makefile'ı

test1: main.o lib1.o lib2.o 
    gcc main.o lib1.a lib2.a -o hello 

test2: main.o combine 
    gcc main.o all_lib.a -o hello 

lib1.o: lib1.c 
    gcc -c lib1.c 
    ar rcs lib1.a lib1.o 

lib2.o: lib2.c 
    gcc -c lib2.c 
    ar rcs lib2.a lib2.o 

combine: lib1.o lib2.o 
    ar rcsT all_lib.a lib1.a lib2.a 

main.o: main.c 
    gcc -c main.c 

clean: 
    rm -rf *.o *.a hello 

main.c

#include<stdio.h> 
#include "lib1.h" 
#include "lib2.h" 

main() 
{ 
    printf("Hello World\n"); 
    func1(); 
    func2(); 
} 

lib1.h

#include<stdio.h> 
void func1(); 

lib2.h

#include<stdio.h> 
void func2(); 

lib1.c standart Elma araçlarını kullanarak şikayet olmadan

#include "lib2.h" 

void func2() 
{ 
    printf("Hello World 2\n"); 
} 

cevap

-1

Bu kaynaklar ve makefile bağlantı

#include "lib1.h" 

void func1() 
{ 
    printf("Hello World 1\n"); 
} 

lib2.c. Kullandığınız araçlar “-arch” anahtarını destekliyorsa, “-arch x86_64” ya da “-arch i386” ifadesini açıkça belirtebilirsiniz?

Nesne dosyalarında ve yürütülebilir dosyalarda hangi mimari (ler) in olduğunu görmek için “dosya” komutunu kullanabilirsiniz. Kütüphane dosyaları için modülleri çıkarmanız ve incelemeniz gerekebilir.

+0

Macport'ta (gcc46) bulunan gcc'nin 64 bit sürümünü kullanıyorum. Standart elma derleyicisini kullanmıyorum çünkü gfortran ile gelmiyor. Şu anda gcc46 + univerisal'i yüklüyorum. İnce arşivin 64-bit kemeri sevmediğine inanıyorum. – Eldila

+0

Her nesne dosyasını incelemek için “dosya” komutunu kullanmanızı ve tüm nesne dosyalarını kütüphaneden çıkarmanızı ve incelemenizi öneririm. Bu, hangi adımların yanlış olduğunu gösteren bazı göstergeler vermelidir. –