makefile so

#a.mak

a:a2.so
a2.so:a2.o
    gcc -shared -o $@ $?

a2.o:a2.c
    gcc -fPIC -c -o $@ $?

a_clean:
    rm -f a*.o
    rm -f a*.so

#b.mak

b:b2.so
b2.so:b2.o a2.so
    gcc -shared -o $@ $?

b2.o:b2.c
    gcc -c -fPIC -o $@ $?

b_clean:
    rm -f b*.o
    rm -f b*.so

#makefile

main:main.o b2.so
    gcc -o $@ $? -Xlinker -rpath ./

main.o:main.c
    gcc -c -o $@ $?
    
clean:
    rm -f main.o
    rm -f main
include a.mak
include b.mak



在 Linux 系统中,通过 Makefile 可以高效地管理项目的编译过程,尤其是在处理包含多个源文件和复杂依赖关系的大型项目时。Makefile 能够自动化生成动态库 `.so` 文件,简化编译流程,提高开发效率。 ### Makefile 中生成 `.so` 文件的配置方法 在 Makefile 中生成共享库(`.so` 文件)的关键在于使用 `-shared` 和 `-fPIC` 编译选项,并正确设置目标文件和链接规则。以下是一个典型的 Makefile 示例: ```makefile # 编译器 CC = gcc # 源文件和目标文件 SRCS = func.c OBJS = $(SRCS:.c=.o) # 动态库名称 TARGET = libfunc.so # 编译选项 CFLAGS = -fPIC -g -shared # 默认目标 all: $(TARGET) # 生成动态库 $(TARGET): $(OBJS) $(CC) $(CFLAGS) -o $@ $^ # 编译源文件为对象文件 %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ # 清理生成的文件 clean: rm -f $(OBJS) $(TARGET) ``` - `CC`:指定使用的编译器,通常为 `gcc` 或 `g++`。 - `SRCS` 和 `OBJS`:定义源文件列表和对应的中间对象文件(`.o` 文件)。 - `TARGET`:指定生成的共享库名称,通常以 `lib` 开头,以 `.so` 结尾。 - `CFLAGS`:编译选项,其中 `-fPIC` 表示生成位置无关代码,`-shared` 表示生成共享库。 - `$@`、`$^`、`$<`:Makefile 中的自动变量,分别表示目标文件、所有依赖文件、第一个依赖文件。 - `all`:默认目标,用于指定最终生成的文件。 - `clean`:清理生成的中间文件和目标文件。 ### Makefile 中的通配符和函数使用 Makefile 支持通配符和函数,用于更灵活地管理源文件和目标文件。例如: ```makefile # 使用 wildcard 函数获取所有源文件 SRCS = $(wildcard *.c) # 使用 patsubst 函数将 .c 文件替换为 .o 文件 OBJS = $(patsubst %.c, %.o, $(SRCS)) ``` - `wildcard`:用于匹配所有 `.c` 文件。 - `patsubst`:用于将 `.c` 文件替换为对应的 `.o` 文件。 ### 编译和链接共享库 在完成 Makefile 配置后,执行以下命令即可生成共享库: ```bash make ``` 该命令将根据 Makefile 中的规则编译源文件并生成 `.so` 文件。生成的 `.so` 文件可以被其他程序动态链接使用。 ### 共享库的使用与部署 生成 `.so` 文件后,若希望其他程序能够正确加载该库,需确保系统能够找到该库文件。可以通过设置 `LD_LIBRARY_PATH` 环境变量来指定库的搜索路径: ```bash export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ``` 此外,也可以使用 `ldconfig` 命令将库路径加入系统缓存: ```bash sudo ldconfig /path/to/library ``` 该命令会更新 `/etc/ld.so.cache` 文件,使系统能够识别新添加的共享库路径。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值