1、动态库的编译
testa.c
#include <stdio.h>
#include "test.h"
void TestA()
{
printf("TestA func\n");
}
testb.c
#include <stdio.h>
#include "test.h"
void TestB()
{
printf("TestB func\n");
}
gcc testa.c testb.c -fPIC -shared -o libtest.so
2、动态库的链接,生成执行文件
main.c
#include "test.h"
int main(int argc, char *argv[])
{
TestA();
TestB();
return 0;
}
3.Makefile
gcc main.o -L. -ltest -o $@
PHONY是一个伪目标,可以防止在Makefile中定义的只执行命令的目标和工作目录下的实际文件出现名字冲突
.c.o: 等价于%.o : %.c 含义是所有的.o文件,依赖于对应的.c文件
Makefile有三个非常有用的变量。分别是$@,$^,$<代表的意义分别是:
$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件。
.PHONY:all clean
CC=gcc
CFLAGS=-Wall -g
SO=libtest.so
BIN=main
all:$(SO) $(BIN)
%.o:%.c
$(CC) $(CFLAGS) -c $< -o $@
$(SO):testa.c testb.c
$(CC) $^ -fPIC -shared -o $@
$(BIN):main.o
$(CC) $< -L. -ltest -o $@
clean:
rm -rf *.o *.so