2009-02-06 14 views
41

मेकफ़ाइल में -आई और -एल फ्लैग का उपयोग क्या है?मेकफ़ाइल में -आई और -एल के बीच क्या अंतर है?

+0

जिनक्स, क्या आप $ एलडीएफएलजीएस में विकल्पों के बारे में पूछ रहे थे या इस तरह के स्विच के रूप में थे? make -l –

+0

@ नाथन.. पूर्व, लेकिन विकल्प पूंजी 'मैं' नहीं 'एल' है। – MainID

उत्तर

75

ये आमतौर पर लिंकर कमांड लाइन का हिस्सा होते हैं, और या तो सीधे एक लक्षित कार्रवाई में प्रदान किए जाते हैं, या आमतौर पर make वैरिएबल को असाइन किया जाता है जिसे लिंक कमांड बनाने के लिए विस्तारित किया जाएगा। उस मामले में:

-L पुस्तकालयों युक्त निर्देशिका के लिए पथ है। पुस्तकालयों के लिए एक खोज पथ।

-l पुस्तकालय आप लिंक करना चाहते हैं उसका नाम है।

उदाहरण के लिए, आप जोड़ना चाहते हैं, तो आप पुस्तकालय ~/libs/libabc.a लिंक करना चाहते हैं:

-L$(HOME)/libs -labc 

जोड़ने के लिए डिफ़ॉल्ट अंतर्निहित नियम का लाभ लेने के लिए, चर LDFLAGS करने के लिए इन झंडे जोड़ने के लिए,

में के रूप में
LDFLAGS+=-L$(HOME)/libs -labc 

यह उदाहरण

012 के लिए एक अच्छी आदत LDFLAGS और LIBS अलग करने के लिए है,
# LDFLAGS contains flags passed to the compiler for use during linking 
LDFLAGS = -Wl,--hash-style=both 
# LIBS contains libraries to link with 
LIBS = -L$(HOME)/libs -labc 
program: a.o b.o c.o 
     $(CC) $(LDFLAGS) $^ $(LIBS) -o [email protected] 
     # or if you really want to call ld directly, 
     # $(LD) $(LDFLAGS:-Wl,%=%) $^ $(LIBS) -o [email protected] 

यहां तक ​​कि अगर यह अन्यथा काम कर सकते हैं, -l... निर्देशों के बाद वस्तुओं है कि उन प्रतीकों का संदर्भ जाना करने वाले हैं। कुछ अनुकूलन (-Wl,--as-needed सबसे स्पष्ट है) गलत आदेश में लिंकिंग होने पर असफल हो जाएंगे।

+0

https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html: > एलडीएफएलजीएस कंपाइलर्स को देने के लिए अतिरिक्त झंडे जब उन्हें लिंकर, 'एलडी', जैसे कि एल। पुस्तकालयों (-lfoo) को इसके बजाय एलडीएलबीएस वैरिएबल में जोड़ा जाना चाहिए। > एलडीआईएलबीएस पुस्तकालय झंडे या कंपाइलर्स को दिए गए नाम जब उन्हें लिंकर, 'एलडी' का आह्वान करना होता है। LOADLIBES एलडीएलबीएस के लिए एक बहिष्कृत (लेकिन अभी भी समर्थित) विकल्प है। गैर पुस्तकालय लिंकर झंडे, जैसे -एल, एलडीएफएलजीएस चर में जाना चाहिए। –

0

ध्यान देने योग्य एक बात यह है कि ये संकलक/लिंकर को पास किए गए विकल्प हैं। तो आपको उनकी भूमिका जानने के लिए कंपाइलर मैन पेज/दस्तावेज़ीकरण को देखना चाहिए।

17

वास्तव में मेकफ़ाइल को ग्रोक करने के लिए, आपको अपने प्रोजेक्ट के टूलचेन के सभी घटकों के लिए कमांड लाइनों की अच्छी समझ भी होनी चाहिए। -I और -L जैसे विकल्प स्वयं को स्वयं नहीं समझते हैं। इसके बजाय, एक कमांड लाइन बनाने का प्रयास कर रहा है जो किसी पूर्व फ़ाइल को एक लक्ष्य फ़ाइल में बदलने के लिए एक उपकरण निष्पादित करेगा।

अक्सर, कि एक सी है या सी ++ स्रोत फ़ाइल एक वस्तु फाइल करने के लिए संकलित किया जा रहा है, और अंततः एक निष्पादन योग्य फ़ाइल प्राप्त करने के लिए जुड़े हुए हैं।

उस मामले में, आप और आपके संकलक के लिए मैनुअल को देखने के लिए की जरूरत है, विशेष रूप से आदेश पंक्ति विकल्प यह समझता है से संबंधित बिट्स।

जेनेरिक शर्तों में जो भी कहा गया है, वे विशिष्ट विकल्प कंपाइलर्स और लिंकर्स के बीच बहुत मानक हैं। -I#include लाइन पर नाम की गई फ़ाइल के लिए कंपाइलर द्वारा खोजी गई स्थानों की सूची में एक निर्देशिका जोड़ता है, और -L-l विकल्प नामक लाइब्रेरी के लिए लिंकर द्वारा खोजी गई स्थानों की सूची में निर्देशिका जोड़ता है।

लब्बोलुआब यह है, cp कि एक makefile की 'भाषा' के रूप में बनाने के लिए (आमतौर पर /bin/sh या कुछ इसी तरह), आम खोल आदेशों (जैसे rm जाना जाता makefile के ही वाक्य रचना का एक संयोजन, अपने खोल है , install, आदि), और आपके कंपाइलर और लिंकर के लिए विशिष्ट आदेश (उदा।आपके शेल प्रॉम्प्ट पर gcc -v --help टाइपिंग आपको जीसीसी द्वारा एक शुरुआती बिंदु के रूप में समझा जाने वाले विकल्पों की लगभग पूर्ण (और अत्यंत लंबी) सूची प्रदान करेगी)।

+0

मुझे अभी भी पता नहीं है कि मैं प्रतिनिधित्व करने का सबसे प्रभावी तरीका क्या है- मैं ध्वज? एलएलएफएलजीएस में अनुवाद किया जा सकता है। – Edmon

संबंधित मुद्दे