linux - 带有静态和共享库的 Makefile

标签 linux bash ubuntu makefile

我从创建 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

$ ./bin/prog
你得到一个错误,你应该使用这个:
$ make

$ export LD_LIBRARY_PATH=$(pwd)/lib

$ ./bin/prog
不要把 LD_LIBRARY_PATH 的设置放在正如我在上面的评论中提到的那样,在makefile中。

关于linux - 带有静态和共享库的 Makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67572761/

相关文章:

linux - Azure应用服务启动命令(必填)

linux - 是否可以在内核模块中编写 IRQ 替换?

linux - 补充模式

c - 如何理解 child 因为 parent 的内存而死亡,即使发送的信号是 "9"

linux - 从 shell 脚本内部记录 sql 错误

bash - 如何删除目录以外的所有文件?

bash - SIGINT 取消读取 bash 脚本?

ubuntu - 新交所开发环境

docker - 为什么 Ubuntu docker 基础镜像只占用 89 MB?

amazon-web-services - Ubuntu WSL Ansible - 用户@localhost 权限被拒绝(公钥,密码)