(一)makefile里涉及到的gcc命令
gcc -I./inc:指定头文件寻找目录
将按照 ./inc --> /usr/include --> /usr/local/include的顺序寻找头文件
gcc -L./lib:指定库文件的寻找目录
将按照 ./lib --> /usr/lib --> /usr/local/include的顺序寻找库文件
gcc -ltest
将使用libtest.so动态链接库或libtest.a静态链接库,优先使用libtest.so
gcc -static -ltest
将强制使用libtest.a静态链接库
编译生成动态链接库:
gcc -o *.c -fPIC -c *.c //-fPIC指明生成和地址无关的目标文件
gcc -o libtest.so -shared *.o //在连接过程中指定-shared,即生成共享形式的目标文件
gcc -o target -L./lib -ltest -Wl,-rpath=./lib //-Wl,-rpath=./lib指定运行时的库文件路径
生成静态库:
gcc -o *.o -c *.c
ar crs libtest.a *.o //libtest.a可以看做是将.o文件进行了打包
gcc -o target -L./lib -ltest
(二)makefile文件
1 只有一个或多个源文件
CC=gcc CFLAGS=-Wall -std=gnu99 TARGET=test SRCS=test.c OBJS=${SRCS:.c=.o} ${TARGET}:${OBJS} ${CC} -o $@ $^ clean: rm -rf ${TARGET} ${OBJS} %.o:%.c ${CC} ${CFLAGS} -o $@ -c $<
2 源文件在src下,头文件在inc下
CC=gcc CFLAGS=-Wall -std=gnu99 INC=-I./inc TARGET=test SRCS=./src/test.c ./src/test_add.c ./src/test_min.c OBJS=${SRCS:.c=.o} ${TARGET}:${OBJS} ${CC} -o $@ $^ rm -rf ${OBJS} clean: rm -rf ${TARGET} ${OBJS} %.o:%.c ${CC} ${FLAGS} ${INC} -o $@ -c $<
3 链接阶段添加动态链接库
CC=gcc CFLAGS=-Wall -std=gnu99 TARGET=test SRCS=./src/test.c ./src/test_add.c OBJS=${SRCS:.c=.o} INC=-I./inc DLIBS=-lm ${TARGET}:${OBJS} ${CC} ${DLIBS} -o $@ $^ rm -rf ${OBJS} clean: rm -rf ${OBJS} ${TARGET} %.o:%.c ${CC} ${FLAGS} ${INC} -o $@ -c $<
4 编译动态链接库
CC=gcc CFLAGS=-Wall -std=gnu99 TARGET=libtest.so SRCS=./src/test.c ./src/test_add.c ./src/test_min.c OBJS=${SRCS:.c=.o} INC=-I./inc ${TARGET}:${OBJS} ${CC} ${CFLAGS} -shared -o $@ $^ rm -rf ${OBJS} clean: rm -rf ${OBJS} ${TARGET} %.o:%.c ${CC} ${CFLAGS} ${INC} -o $@ -fPIC -c $<