使用gcc
进行编译链接
#仅仅将源码编译成目标文件,不进行链接
gcc -c hello.c
#生成hello.o文件,不会生成可执行文件
#加入编译优化
gcc -O hello.c -c
#生成hello.o文件,不会生成可执行文件
#编译链接生成可执行文件
gcc hello.c -lm -L/usr/bin -I/usr/include
#生成可执行文件a.out
#-lm 表示libm.so或libm.a 函数库文件
#-L 后面接的是指定的函数库搜索路径
#-I 后边接的是指定的include包含库搜索路径
#将编译的结果输出为某个文件名
gcc -o helloname hello.c
#生成可执行文件helloname
#输出更多编译过程中的信息
gcc -o helloname hello.c -Wall
#-Wall表示 输出详细的警告信息
makefile
的一些基本语法规则
target : 目标文件1 目标文件2 目标文件3 .....
<tab> gcc -o 希望建立的可执行文件名 目标文件1 目标文件2 目标文件3 .....
- 例如:
mian: main.o haha.o sin_value.o cos_value.o
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
- 其中
makefile
文件中可以设定多个target
mian: main.o haha.o sin_value.o cos_value.o
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
#clean是第二个目标(名字可以自定义)
clean:
rm -f main main main.o haha.o sin_value.o cos_value.o
- 在使用的时候通过
make
确定执行哪个目标
make main #表示执行第一个目标main
make clean #表示执行第二个目标clean
make clean main #表示先执行main 再执行clean
- 也可以使用变量
${变量}
或$ (变量)
#定义一个变量LIBS和OBJS
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
#使用变量的方式 ${变量}或$(变量)
#$@为特殊变量,表示当前目标,因此下文中的$@表示main
mian: ${OBJS}
gcc -o $@ ${OBJS} ${LIBS}
clean:
rm -f main ${OBJS}
- 也可以在命令行中直接定义变量
>> CFLAGS="-Wall" make clean main
#执行之后,makefile中的CFALGS就会替换成 -Wall
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
mian: ${OBJS}
gcc -o $@ ${OBJS} ${LIBS} -${CFLAGS}
clean:
rm -f main ${OBJS}
- 变量的优先级
①命令行中添加的变量
②makefile文件中定义的变量
③shell环境中的变量