2013-02-27 23 views
6

voglio aggiungere il percorso libreria condivisa alla mia Makefile. Ho inserito il comando export nel makefile, viene persino chiamato, ma devo ancora esportarlo manualmente di nuovo. Qual è l'approccio corretto?aggiungendo percorso di libreria condivisa per 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)/ 

Esecuzione:

$ ./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

Il comando esegue una shell che definisce la variabile, la esporta (ovvero la rende visibile ai propri figli), quindi esce. Non può controllare le shell successive o lo stato interno di Make. Si vuole invece definire come variabile Makefile; in GNU Make, puoi esportare le variabili come nella shell. Ma la risposta di @ Pradheep descrive già come questo viene solitamente fatto. – tripleee

+0

Possibile duplicato di [Impostazione percorso alla libreria condivisa all'interno di un makefile per la compilazione] (http://stackoverflow.com/questions/32200799/setting-path-to-shared-library-inside-a-makefile-for-compile) – Alex

risposta

2

Il solito modo è quello di copiare la libreria dinamica durante la marca di default e ad uno del percorso di libreria standard

/usr/local/bin

o uno del vostro progetto percorso della libreria e aggiungere la libreria al eseguibile utilizzando

-L/progetto/specifiche/percorso

durante make install.

1

Come già accennato here, la cosa che probabilmente si desidera è l'opzione linker -rpath.

In questo modo, è possibile impostare un percorso di ricerca predefinito per il file binario. Sembra che ancora utilizza già -rpath nel makefile, ma si specifica il percorso sbagliato:

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

Così il binario cercherà nella directory corrente per DYN-librerie. Tuttavia, si aggiunge al proprio LD_LIBRARY_PATH in seguito, per l'esecuzione del file binario, quindi il percorso indicato . sembra essere errato.

Si prega di prendere una prova per la seguente correzione:

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

del genere non dovrebbe essere necessario specificare un LD_LIBRARY_PATH per l'esecuzione.

Problemi correlati