将共享库路径添加到Makefile
问题描述:
我想将共享库路径添加到我的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"
答
的常用方法是在默认的化妆和标准库路径的一个动态库复制
/usr/local/bin
或项目库的路径之一,并添加库使用make期间
-L /项目/特定/路径
安装到可执行文件。
答
如前所述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。
您的命令运行一个定义变量的shell,将其导出(即使其对其子项可见),然后退出。它无法控制后续的shell或Make的内部状态。你想把它定义为一个Makefile变量,在GNU Make中,你可以像在shell中一样'export'变量。但@ Pradheep的回答已经描述了这通常是如何完成的。 – tripleee 2014-12-13 08:40:28
[设置makefile文件*享库的路径以进行编译]的可能重复(http://*.com/questions/32200799/setting-path-to-shared-library-inside-a-makefile-for-compile) – Alex 2016-06-22 13:48:52