2012-08-17 22 views
5

मैं एक पतली संग्रह को जोड़ने का प्रयास कर रहा हूं जो दो संग्रह पुस्तकालयों को एक सी प्रोग्राम में जोड़ती है।हिम तेंदुए पर पतले संग्रह से लिंक

मैं दो सरल हैलो दुनिया कार्यों का निर्माण किया और आदेश के साथ एक संग्रह का निर्माण:

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

दो अभिलेखागार फिर एक पतली संग्रह का उपयोग कर बनाए गए हैं,:

ar rcsT all_lib.a lib1.a lib2.a 

और फिर जीसीसी के साथ संकलित :

gcc main.o all_lib.a -o hello 

मैं एक त्रुटि संदेश के साथ समाप्त होता हूं:

ld: चेतावनी: फ़ाइल all_lib.a अनदेखी, फ़ाइल असमर्थित फ़ाइल स्वरूप के लिए बनाया गया था जो वास्तुकला नहीं है जोड़ा जा रहा है (x86_64)

वास्तुकला x86_64 के लिए अपरिभाषित प्रतीक: "_func1", से संदर्भित: main.o में _main "_func2", से संदर्भित: main.o ld में _main: प्रतीक (रों) अगर मैं lib1.a और lib2 साथ main.o लिंक करने के प्रयास वास्तुकला x86_64

के लिए नहीं मिला। एक सीधा, सब कुछ काम करता है।

मैक ओएसएक्स 10.6.8 पर जीसीसी (मैकपॉर्ट्स जीसीसी 46 4.6.3_3) 4.6.3 और जीएनयू आर (जीएनयू बिनुटिल्स) 2.21 का उपयोग कर रहा हूं।


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 मानक एप्पल उपकरणों का उपयोग बिना किसी शिकायत के

#include "lib1.h" 

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

lib2.c

#include "lib2.h" 

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

उत्तर

-1

इन स्रोतों और makefile लिंक। आपके द्वारा उपयोग किए जाने वाले टूल "-arch" स्विच का समर्थन करते हैं, तो आप स्पष्ट रूप से "-arch x86_64" या "-arch i386" निर्दिष्ट कर सकते हैं?

आप "फ़ाइल" कमांड का उपयोग यह देखने के लिए कर सकते हैं कि कौन सी आर्किटेक्चर ऑब्जेक्ट फाइलों और निष्पादन योग्य फाइलों में हैं। लाइब्रेरी फ़ाइलों के लिए, आपको मॉड्यूल निकालना पड़ सकता है और उन्हें जांचना पड़ सकता है।

+0

मै मैकपोर्ट (gcc46) में मिली जीसीसी के 64-बिट संस्करण का उपयोग कर रहा हूं। मैं मानक सेब कंपाइलर का उपयोग नहीं कर रहा हूं क्योंकि यह gfortran के साथ नहीं आता है। मैं वर्तमान में gcc46 + univerisal स्थापित कर रहा हूँ। मुझे विश्वास है कि पतली संग्रह 64-बिट आर्क पसंद नहीं है। – Eldila

+0

मेरा सुझाव है कि आप प्रत्येक ऑब्जेक्ट फ़ाइल की जांच करने के लिए "फ़ाइल" कमांड का उपयोग करें और आप पुस्तकालय से सभी ऑब्जेक्ट फ़ाइलों को निकाल दें और उनकी जांच करें। इससे कुछ संकेत दिए जाएंगे कि कौन से कदम गलत व्यवहार कर रहे हैं। –