Linux 带有静态和共享库的Makefile

Linux 带有静态和共享库的Makefile,linux,bash,ubuntu,makefile,Linux,Bash,Ubuntu,Makefile,我从创建Makefile开始。我编写了简单的Makefile,它创建了两个库,静态库和动态库,用于编译可执行文件。用于程序操作的文件位于各个文件夹中:*.c在src中,*.h在include中, *.a和*.so在lib中,可执行文件在bin中。其余的在makefile文件夹中。我的Makefile创建所有文件,但找不到文件。我在gcc中使用VPATH和-L。但那不是工作。我正在开发Ubuntu20.04LTS。谢谢你的帮助 vpath %.c src vpath %.h include v

我从创建Makefile开始。我编写了简单的Makefile,它创建了两个库,静态库和动态库,用于编译可执行文件。用于程序操作的文件位于各个文件夹中:*.c在src中,*.h在include中, *.a和*.so在lib中,可执行文件在bin中。其余的在makefile文件夹中。我的Makefile创建所有文件,但找不到文件。我在gcc中使用VPATH和-L。但那不是工作。我正在开发Ubuntu20.04LTS。谢谢你的帮助

vpath %.c src

vpath %.h include

vpath %.a lib

vpath %.so lib

%.o: %.c
    gcc -c $<

%: %.o
    gcc -o ./bin/$@ $^  -L./lib -I./bin

libj%.a: %j.o
    ar rs ./lib/$@ $^ 

lib%r.so: p%.o
    gcc -shared -o ./lib/$@ $^  -L./lib


prog: prog.o libjp.a libgr.so

prog.o: prog.c libgr.h libjp.h

libjp.a: pj.o pp.o

pj.o: pj.c

pp.o: pp.c

libgr.so: pg.o pr.o

pg.o: pg.c
    
pr.o: pr.c
vpath%.c src
vpath%.h包括
vpath%.a库
vpath%.so lib
%.o:%.c
gcc-c$<
%:%
gcc-o./bin/$@$^-L./lib-I./bin
libj%.a:%j.o
应收帐款./lib/$@$^
库%r.so:p%.o
gcc-shared-o./lib/$@$^-L./lib
prog:prog.o libjp.a libgr.so
prog.o:prog.c libgr.h libjp.h
libjp.a:pj.o pp.o
pj.o:pj.c
pp.o:pp.c
libgr.so:pg.o pr.o
第o页:第c页
公关部:公关部

我不明白你所说的“在哪个文件夹中”是什么意思,在运行程序之前,你必须在shell中运行它

因此,如果您运行以下命令:

$ make

$ ./bin/prog
如果出现错误,应使用以下命令:

$ make

$ export LD_LIBRARY_PATH=$(pwd)/lib

$ ./bin/prog

不要将
LD\u LIBRARY\u PATH
的设置放在makefile中,正如我在上面的评论中提到的那样。

当你的配方创建一些文件时,你总是知道它是错误的,而不是确切的
$
。Make将变量
$@
设置为它希望您的配方创建的文件。如果您的配方创建了其他文件,如
/bin/$@
/lib/$@
,那么它将永远不会工作。因此,我如何更改它使其工作,但同时保持目录树结构?您必须更改配方的目标,使其成为正确的对象。如果希望文件位于
/lib
中,则目标必须是
/lib/libj%.a,而不是
libj%.a
。现在make知道该目标应该去哪里,并将正确设置
$@
。然后,当然,您必须将目标
libjp.a:…
更改为
/lib/libjp.a:…
,然后当然您必须更改前提条件
prog:。。。libjp.a
prog:/lib/libjp.a
。我无法想象这些文件应该放在哪里!你得说出来,好吧,比你强多了。但我有另一个问题,加载共享库时出错:lib/libgr.so:无法打开共享对象文件:没有这样的文件或目录/。当库位于可执行文件以外的其他文件夹中时,我应该如何设置$LD_LIBRARY_PATH?有很多方法可以做到这一点,这完全取决于您想要什么。您已经描述了其中一个:将目录添加到
LD\u LIBRARY\u PATH
变量中,如下所示:
export LD\u LIBRARY\u PATH=$(pwd)/lib
。要明确的是,在启动程序之前,您在shell中运行这个。。。你不用把它放在你的makefile里,它可以工作!非常感谢您的帮助和时间。