Linux 带有静态和共享库的Makefile
我从创建Makefile开始。我编写了简单的Makefile,它创建了两个库,静态库和动态库,用于编译可执行文件。用于程序操作的文件位于各个文件夹中:*.c在src中,*.h在include中, *.a和*.so在lib中,可执行文件在bin中。其余的在makefile文件夹中。我的Makefile创建所有文件,但找不到文件。我在gcc中使用VPATH和-L。但那不是工作。我正在开发Ubuntu20.04LTS。谢谢你的帮助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
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里,它可以工作!非常感谢您的帮助和时间。