2013-02-27 151 views
6

我想將共享庫路徑添加到我的Makefile。我已經在makefile中輸入了export命令,它甚至被調用,但我仍然需要再次手動導出它。 什麼是正確的方法?將共享庫路徑添加到Makefile

的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

您的命令運行一個定義變量的shell,將其導出(即使其對其子項可見),然後退出。它無法控制後續的shell或Make的內部狀態。你想把它定義爲一個Makefile變量,在GNU Make中,你可以像在shell中一樣'export'變量。但@ Pradheep的回答已經描述了這通常是如何完成的。 – tripleee 2014-12-13 08:40:28

+0

[設置makefile文件中共享庫的路徑以進行編譯]的可能重複(http://stackoverflow.com/questions/32200799/setting-path-to-shared-library-inside-a-makefile-for-compile) – Alex 2016-06-22 13:48:52

回答

2

的常用方法是在默認的化妝和標準庫路徑的一個動態庫複製

/usr/local/bin

或項目庫的路徑之一,並添加庫使用make期間

-L /項目/特定/路徑

安裝到可執行文件。

1

如前所述here,您可能需要的是鏈接器選項-rpath

就像那樣,您可以設置二進制文件的默認搜索路徑。看起來你甚至已經在你的makefile使用-rpath,但指定了錯誤的路徑:

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

所以二進制文件將在DYN-庫當前目錄下搜索。 但是,稍後您將../lib添加到您的LD_LIBRARY_PATH,以執行二進制文件,因此給定的路徑.似乎是錯誤的。

請大家試試以下修正:

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

就像你不應該需要指定執行LD_LIBRARY_PATH。