有一个程序main.c,一个库lib.so编写makefile使用动态编译链接
时间: 2024-03-26 19:34:16 浏览: 91
好的,下面是一个简单的Makefile示例:
```makefile
CC = gcc
CFLAGS = -Wall -Werror
LDFLAGS = -L. -lmylib
.PHONY: all clean
all: main
main: main.o
$(CC) $(LDFLAGS) $^ -o $@
main.o: main.c
$(CC) $(CFLAGS) -c $<
libmylib.so: mylib.o
$(CC) -shared $^ -o $@
mylib.o: mylib.c mylib.h
$(CC) $(CFLAGS) -fPIC -c $<
clean:
rm -f main main.o libmylib.so mylib.o
```
这个Makefile包含了三个目标(all,main和libmylib.so)和一个伪目标(clean)。
首先,我们定义了编译器和编译选项。CFLAGS包含了-Wall和-Werror选项,这样编译器会产生所有的警告,并将警告视为错误,以便我们在编译时就可以发现问题。
接下来,我们定义了LDFLAGS,它包含了我们的库文件的路径和名称。我们将在后面的步骤中创建这个库。
然后,我们定义了目标all,这个目标依赖于目标main。它表示我们要一次性编译所有的目标。
目标main依赖于main.o,表示我们要编译出可执行文件main。我们使用了-L选项指定了库文件的路径,使用-l选项指定了库文件的名称。$^表示目标的所有依赖项,$@表示目标名称。
目标main.o依赖于main.c,表示我们要编译出目标文件main.o。
目标libmylib.so依赖于mylib.o,表示我们要编译出动态库libmylib.so。我们使用了-shared选项指定了动态库的类型。
目标mylib.o依赖于mylib.c和mylib.h,表示我们要编译出目标文件mylib.o。我们使用了-fPIC选项,这是编译动态库所必需的。
最后,我们定义了伪目标clean,用于删除所有生成的文件。
使用这个Makefile,我们可以通过运行make命令来编译我们的程序和库。我们也可以使用make clean命令来删除所有生成的文件。
阅读全文