gcc命令以及makefile文件

(一)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 $<
原文地址:https://www.cnblogs.com/buptlyn/p/4398734.html