添加共享库路径到Makefile

kic*_*r86 7 makefile

我想将共享库路径添加到我的Makefile中.我已经在makefile中输入了export命令,它甚至被调用,但我仍然需要再次手动导出它.什么是正确的方法?

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)/
Run Code Online (Sandbox Code Playgroud)

执行:

$ ./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"
Run Code Online (Sandbox Code Playgroud)

Ale*_*lex 6

正如这里已经提到的,您可能需要的是链接器选项-rpath

像这样,您可以为二进制文件设置默认搜索路径。看起来您甚至已经-rpath在 makefile 中使用了,但指定了错误的路径:

LIBS = -L$(LIB) -lfuse -lsqlite3 -lkw_taglib -ltag_c -ltag -Wl,-rpath=.
Run Code Online (Sandbox Code Playgroud)

因此二进制文件将在当前目录中搜索 dyn-libraries。但是,您稍后添加../libLD_LIBRARY_PATH二进制文件的执行中,因此给定的路径.似乎是错误的。

请尝试以下修复:

LIBS = -L$(LIB) -lfuse -lsqlite3 -lkw_taglib -ltag_c -ltag -Wl,-rpath=../lib
Run Code Online (Sandbox Code Playgroud)

就像这样,您不需要指定 LD_LIBRARY_PATH 来执行。


Pra*_*eep 5

通常的方法是在默认制作期间将动态库复制到标准库路径之一

/usr/本地/bin

或您的项目库路径之一并将库添加到可执行文件中

-L/项目/特定/路径

在 make 安装过程中。