【问题标题】:Makefile with static and shared library带有静态和共享库的 Makefile
【发布时间】: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


【解决方案1】:

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

所以,如果你运行这个:

$ make

$ ./bin/prog

你得到一个错误,你应该使用这个:

$ make

$ export LD_LIBRARY_PATH=$(pwd)/lib

$ ./bin/prog

不要LD_LIBRARY_PATH的设置放在我上面在我的cmets中提到的makefile中。

【讨论】:

  • 有效!非常感谢您的帮助和时间。
猜你喜欢
  • 2011-07-23
  • 1970-01-01
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-27
  • 1970-01-01
相关资源
最近更新 更多