【发布时间】:2021-05-17 15:33:10
【问题描述】:
我开始创建 Makefile。我编写了简单的 Makefile,它创建了两个库,静态和动态并用于编译可执行文件。程序运行的文件位于单独的文件夹中:src 中的 *.c,include 中的 *.h, lib 中的 *.a 和 *.so 以及 bin 中的可执行文件。其余的都在 makefile 文件夹中。我的 Makefile 创建所有文件但找不到文件。我在 gcc 中使用 VPATH 和 -L。但那是行不通的。我正在开发 Ubuntu 20.04 LTS。感谢大家的帮助。
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
【问题讨论】:
-
您总是知道您的配方在创建某些文件时是错误的,而不是完全
$@。 Make 会将变量$@设置为它希望您的配方创建的文件。如果您的配方创建了一些 other 文件,例如./bin/$@或./lib/$@,那么它将永远无法工作。 -
那么,我怎样才能改变它以使其工作但同时保持目录树结构?
-
你必须改变你的食谱的目标是正确的。而不是
libj%.a,如果您希望文件位于./lib中,则目标必须是./lib/libj%.a。现在 make 知道该目标应该去哪里,并将正确设置$@。然后,当然,您必须将目标libjp.a: ...更改为./lib/libjp.a: ...,然后当然您必须将先决条件prog: ... libjp.a更改为prog: ... ./lib/libjp.a。 Make无法想象所有这些文件应该放在哪里!你必须告诉它。 -
好吧,比你好多了。但是我有其他问题,加载共享库时出错:lib/libgr.so:无法打开共享对象文件:没有这样的文件或目录/。当库位于可执行文件以外的其他文件夹中时,我应该如何设置 $LD_LIBRARY_PATH?跨度>
-
有很多方法可以做到,这完全取决于你想要什么。您已经描述了其中之一:将目录添加到您的
LD_LIBRARY_PATH变量中,如下所示:export LD_LIBRARY_PATH=$(pwd)/lib。需要明确的是,您在启动程序之前在您的 shell 中运行它......您不会将它放在您的 makefile 中。
标签: linux bash ubuntu makefile