2013-08-12 5 views
9

में संकलित करें मेरे पास कुछ सी स्रोत फ़ाइलें हैं और मैं gcc का उपयोग कर रहा हूं। मैं मूल रूप से उन सभी को संकलित करना चाहता हूं और एक एकल ऑब्जेक्ट फ़ाइल बनाना चाहता हूं। जब मैं कोशिश:एकाधिक सी स्रोत fles को एक अद्वितीय ऑब्जेक्ट फ़ाइल

gcc -c src1.c src2.c src3.c -o final.o 

मैं:

gcc: cannot specify -o with -c or -S with multiple files 

अगर मैं कोशिश:

gcc -c src1.c src2.c src3.c 

मैं तीन अलग अलग वस्तु फ़ाइलों मिलता है। मैं एक ही ऑब्जेक्ट फ़ाइल (मैं इसका नाम भी निर्दिष्ट करना चाहता हूं) को वापस करने के लिए सभी फ़ाइलों को संकलित करने के लिए gcc कैसे बता सकता हूं? धन्यवाद।

शायद इस मामले में एक और अधिक आम दृष्टिकोण है, कृपया मुझे बताएं।

+1

ठीक है, कृपया मुझे बताओ कैसे ... – Andry

+0

पढ़ें http://tldp.org/HOWTO/Program-Library-HOWTO/ और 'make' –

+0

बीटीडब्लू के बारे में जानें, आप वास्तव में क्यों पूछते हैं? –

उत्तर

10

आप एकाधिक स्रोत फ़ाइलों को एक ऑब्जेक्ट फ़ाइल में संकलित नहीं कर सकते हैं। एक ऑब्जेक्ट फ़ाइल एक एकल स्रोत फ़ाइल और उसके शीर्षलेख का संकलित परिणाम होता है (जिसे translation unit भी कहा जाता है)।

$ ar cr libfoo.a file1.o file2.o file3.o 

फिर आप इस स्थिर पुस्तकालय लिंक करते समय, या तो यह सीधे गुजर एक वस्तु फ़ाइल के रूप में उपयोग कर सकते हैं:

आप संकलित फ़ाइलें गठबंधन करने के लिए चाहते हैं, यह आम तौर पर ar आदेश का उपयोग कर एक स्थिर पुस्तकालय में संयुक्त है:

$ gcc file4.o libfoo.a -o myprogram 

या -l झंडा

$ gcc file4.o -L. -lfoo -o myprogram 
के साथ एक पुस्तकालय के रूप में यह के साथ जोड़ने
+1

अपडेट किया गया इसका मतलब है कि जीसीसी विभिन्न स्रोत फ़ाइलों में फ़ंक्शन इनलाइन नहीं कर सकता है? –

+3

@CrouchingKitten नहीं * कंपाइलर *, लेकिन * लिंकर * कुछ लिंक-टाइम अनुकूलन करने में सक्षम हो सकता है जिसमें क्रॉस-टीयू (अनुवाद इकाई) इनलाइनिंग शामिल हो सकती है। –

4

हो सकता है आप इस के लिए देख रहे:

ld -r src1.o src2.o src3.o -o final.o 

लेकिन इसकी हमेशा उन्हें संग्रहीत है,

ar rvs libmy.a file1.o file2.o file3.o

का उपयोग कर फिर से जोड़ने के लिए -lmy का उपयोग अच्छा।

+0

नहीं 'src1.c src2.c src3.c' स्रोत फ़ाइलों को 'ld' के लिए लेकिन' src1.o src2.o src3.o' * ऑब्जेक्ट * फ़ाइलें! –

+0

@ बेसिलस्टारनकेविच, धन्यवाद, – P0W

9

यह आगे बढ़ने का एक सामान्य तरीका नहीं है, लेकिन आप निम्नलिखित सामग्री के साथ एक नई final.c फ़ाइल बनाकर आसानी से प्राप्त कर सकते हैं।

#include "src1.c" 
#include "src2.c" 
#include "src3.c" 

फिर आप इसे निम्नानुसार संकलित कर सकते हैं।

gcc -c final.c -o final.o 

नोट मुद्दों, वहाँ संकलन त्रुटियों को पढ़ने के लिए, भले ही प्रत्येक फ़ाइल सफलतापूर्वक संकलित जब अलग से संकलित कर सकते हैं। यह विशेष रूप से मैक्रो परिभाषाओं के साथ होता है और इसमें विलय आपकी स्रोत फ़ाइलों को एक ही तरीके से विलय करता है।

0

या तो आप final.c बनाते हैं जिसमें सभी .c फ़ाइलें शामिल होंगी तो आप gcc -c final.c कमांड का उपयोग करके इस अंतिम को संकलित कर सकते हैं।

या

एक अन्य विधि संग्रह का प्रयोग है।संबंधित .o प्राप्त करने के लिए सभी फ़ाइलों को बनाएं, फिर एक लाइब्रेरी में संग्रह करें जिसमें उन सभी .o फ़ाइल होगी।

-1

gcc -o final file1.c file2.c file3.c 

यह मेरे लिए काम करता उपयोग करके देखें।

+0

यह एक बाइनरी फ़ाइल उत्पन्न करेगा, जो स्पष्ट रूप से प्रश्न नहीं है (ऑब्जेक्ट फ़ाइल)। कृपया अन्य लोगों को भ्रमित न करने के लिए अपने उत्तर की समीक्षा करें या इसे हटा दें। –

3

एक वस्तु फ़ाइल में एकाधिक स्रोत फ़ाइलें संयोजित करने के लिए (कम से कम के बाद से जीसीसी 4.1), संकलक/लिंकर विकल्प --combine

(संपादित करें) बाद में संकलक विकल्प -flto के साथ बदल दिया, स्वत: जोड़ने के साथ प्रयोग संकलन स्थिति के आधार पर: Requirements to use flto

+0

मौजूद नहीं है? g ++: त्रुटि: अपरिचित कमांड लाइन विकल्प '--combine' gcc --version जीसीसी (जीसीसी) 4.8.3 20140 9 11 (रेड हैट 4.8.3-7) – gaoithe

+0

यह [हटा दिया गया था] (https://stackoverflow.com जीसीसी 4.6 में/प्रश्न/26804314/जीसीसी-त्रुटि-अपरिचित-कमांड-लाइन-विकल्प-गठबंधन)। – Hedede

0

आप कर सकते हैं हमेशा पाइप जीसीसी के लिए फ़ाइलें:

join file1.c file2.c file3.c | gcc -x c -c -o single.o - 

भाषा निर्दिष्ट विकल्प मत भूलना, "-xc" है, जो अब फ़ाइल से निष्कर्ष निकाला नहीं जा सकता विस्तार। आप जीसीसी को सिंगल ट्रेलिंग डैश के साथ stdin से इनपुट स्वीकार करने के लिए कहते हैं "-"।

ध्यान दें कि यह निम्नलिखित सामग्री के साथ एक फ़ाइल "final.c" संकलन के बराबर है:

#include "file1.c" 
#include "file2.c" 
#include "file3.c" 

साथ
gcc -c -o single.o final.c 
संबंधित मुद्दे