2013-02-27 133 views
6

पर साझा लाइब्रेरी पथ जोड़ना मैं अपने मेकफ़ाइल में साझा लाइब्रेरी पथ जोड़ना चाहता हूं। मैंने मेकफ़ाइल में निर्यात कमांड में रखा है, इसे भी कॉल किया जाता है, लेकिन मुझे अभी भी इसे मैन्युअल रूप से निर्यात करना होगा। सही दृष्टिकोण क्या है?मेकफ़ाइल

Makefile:

SOURCES = kwest_main.c fusefunc.c dbfuse.c logging.c dbbasic.c dbinit.c dbkey.c metadata_extract.c plugins_extraction.c import.c 

LIBS = -L$(LIB) -lfuse -lsqlite3 -lkw_taglib -ltag_c -ltag -Wl,-rpath=. 

INCLUDE = ../include 
LIB = ../lib 

EXE = kwest 

CC = gcc 

CCFLAGS = -g -Wall -Wextra -std=gnu99 -pedantic-errors -I$(INCLUDE) 

OFLAGS = -c 

ARCH = $(shell getconf LONG_BIT) 

X = -D_FILE_OFFSET_BITS=$(ARCH) 

OBJECTS = $(SOURCES:.c=.o) 

$(EXE) : $(OBJECTS) 
    $(CC) -o $(EXE) $(OBJECTS) $(LIBS) 

%.o: %.c 
    $(CC) $(OFLAGS) $(CCFLAGS) $< 

fusefunc.o: fusefunc.c 
    $(CC) $(OFLAGS) $(CCFLAGS) $< $X 

kwest_libs: kw_taglib 
--->export LD_LIBRARY_PATH=$(LIB):$LD_LIBRARY_PATH 

kw_taglib: plugin_taglib 

plugin_taglib: plugin_taglib.o kwt_upd_meta.o 
    gcc -g -shared -I$(INCLUDE) -Wl,-soname,libkw_taglib.so -o $(LIB)/libkw_taglib.so -ltag -ltag_c plugin_taglib.o kwt_upd_meta.o 

plugin_taglib.o: 
    gcc -c -g -I$(INCLUDE) -Wall -Wextra -pedantic-errors -std=gnu99 -fPIC -ltag_c -c plugin_taglib.c 

kwt_upd_meta.o: 
    g++ -c -g -I$(INCLUDE) -Wall -Wextra -pedantic-errors -fPIC -ltag kwt_upd_meta.cpp 

c: clean 

clean: 
    rm -rf *.o 
    rm -rf *.db 

ca: cleanall 

cleanall: clean 
    rm -rf $(EXE) 

ob: cleanall 
    rm -rf ~/.config/$(EXE)/ 

निष्पादन:

$ ./kwest mnt 
./kwest: error while loading shared libraries: libkw_taglib.so: cannot open shared object file: No such file or directory 
$ export LD_LIBRARY_PATH=../lib:D_LIBRARY_PATH 
$ ./kwest mnt 
"executes correctly" 
+0

आपका आदेश एक खोल चलाता है जो चर को परिभाषित करता है, इसे निर्यात करता है (यानी इसे अपने बच्चों के लिए दृश्यमान बनाता है), फिर बाहर निकलता है। यह बाद के गोले या मेक की आंतरिक स्थिति को नियंत्रित नहीं कर सकता है। आप इसे मेकफ़ाइल चर के रूप में परिभाषित करना चाहते हैं; जीएनयू में, आप खोल में जैसे वैरिएबल 'निर्यात' कर सकते हैं। लेकिन @ प्रदीप का जवाब पहले से ही वर्णन करता है कि यह आमतौर पर इसके बजाय कैसे किया जाता है। – tripleee

+0

संभावित डुप्लिकेट [संकलन के लिए मेकफ़ाइल के अंदर साझा लाइब्रेरी में पथ सेट करना] (http://stackoverflow.com/questions/32200799/setting-path-to-shared-library-inside-a-makefile-for-compile) – Alex

उत्तर

2

हमेशा की तरह डिफ़ॉल्ट बनाने के दौरान और मानक पुस्तकालय पथ से एक के लिए गतिशील पुस्तकालय कॉपी करने के लिए है

/यूएसआर/स्थानीय/बिन

या अपनी परियोजना पुस्तकालय पथ में से एक और स्थापित कर के दौरान

एल/परियोजना/विशिष्ट/पथ

का उपयोग कर एक्ज़िक्यूटेबल में पुस्तकालय जोड़ें।

1

जैसा कि पहले से ही उल्लेख किया गया है here, जो चीज आप शायद चाहते हैं वह लिंकर विकल्प -rpath है।

इसी तरह, आप बाइनरी के लिए एक डिफ़ॉल्ट खोज पथ सेट कर सकते हैं।

LIBS = -L$(LIB) -lfuse -lsqlite3 -lkw_taglib -ltag_c -ltag -Wl,-rpath=. 

तो द्विआधारी dyn-पुस्तकालयों के लिए मौजूदा निर्देशिका में खोजेगा: की तरह तुम भी पहले से ही अपने makefile में -rpath उपयोग करें, लेकिन आप गलत पथ निर्दिष्ट लग रहा है। हालांकि, बाइनरी के निष्पादन के लिए आप को अपने LD_LIBRARY_PATH में जोड़ते हैं, इसलिए दिया गया पथ . गलत लगता है।

कृपया निम्न सुधार के लिए एक कोशिश ले:

LIBS = -L$(LIB) -lfuse -lsqlite3 -lkw_taglib -ltag_c -ltag -Wl,-rpath=../lib 

जैसा कि आप निष्पादन के लिए एक LD_LIBRARY_PATH निर्दिष्ट करने की आवश्यकता नहीं होनी चाहिए।