.c 文件用 gcc
.cc 文件用g++
gcc -E main.c -o main.i 预编译 宏替换
gcc -S main.i -o main.s 编译 汇编语言
as mian.s -o main.o 汇编 单个的二进制目标文件 可以在命令行输入 nm main.o
gcc -o main main.o 链接 多个二进制目标文件,连接成一个可执行文件
法一
gcc -E main.c -o main.i
gcc -S main.i -o main.s
gcc -o main main.s
法二
gcc -c main.c -o main.o
gcc -o main main.o
法三
gcc -o main mian.c
静态库的使用
#include <stdio.h>
#include "add.c"
#define N 2
int main()
{
int i= 0 ;
for ( ; i< 10 ; i++ )
{
printf("I am the %d \n",i*N);
}
printf( "2 + 3 = %d \n", add(2 ,3) );
printf("Hello world\n");
return 0;
}
add.c 文件
#include <stdio.h>
int add (int a , int b )
{
return a + b ;
}
不使用库时,需要 #incude “add.c” 或者 在main函数文件中 声明函数 int add( int ,int)
同时编译两个文件 gcc -o main mian.c add.c
使用静态或者动态库时 只需要在main函数文件中 声明函数 int add( int ,int)
int main()
{
int i= 0 ;
for ( ; i< 10 ; i++ )
{
printf("I am the %d \n",i*N);
}
printf( "2 + 3 = %d \n", add(2 ,3) );
printf("Hello world\n");
return 0;
}
编译时 要将add 变为静态库或者动态库
静态库: gcc -c add.c 或者 gcc -c add.c -o add.o 生成add.o文件
ar crsv libadd.a add.o
sudo cp libadd.a /lib (/lib/usr)
gcc -o main main.o -ladd (代表libadd)
静态库如果有变化则需要重新的编译
动态库 代码写法一致,编译时不同
-fpic 相对位置无关的代码
gcc -fpic -Wall -c add.c
gcc -shared -o libadd.so add.o
复制 sudo cp libadd.so /lib
gcc -o main main.c -ladd
makefile
target:dependency 目标文件:依赖文件 如果目标文件的更新时间比依赖文件的早,则执行更新
注意 command 必须要以 tab 开头
main : main.o add.o
gcc -o main main.o
main.o :main.c
gcc -o main.c
add.o : add.c
gcc -o add.c
.PHONY rebuild clean
rebuild: clean main
clean :
rm -rf *.o main
gdb 程序调试
gcc -o main main.c -g
gdb main
小写L 显示代码
b n 在n 行加入断点 d n 删除第n 个断点
n 不进入函数下一步
s 进入函数
r 运行
c 运行到结尾
q 退出
info 变量名 查看变量信息 (所在的进程,数值大小)
x & 变量名 查看变量的地址
bt 段错误 stack 栈上的数据
gdb ./main core 定位段错误
ps : linux的输入与输出的缓冲区
输入缓冲区清楚 getchar();
输出缓冲区 fflush(stdout);
linux 实现system(“pause”); 使用两个getchar();
please enter the key
getchar();
getchar();
常用makefile
OBJS:= main.o add.o
EXE:= main
(
E
X
E
)
:
(EXE):
(EXE):(OBJS)
gcc -o $(EXE) $(OBJS)
main.o :mian.c
gcc -c mian.c
add.o :add.c
gcc -c add.c
clean : rm &(EXE) $(OBJS)
$@ 当前命令目标文件
$^ 当前命令的目标文件
OBJS := main.o add.c
CC:= gcc
main:$(OBJS)
$(CC) -o $@ $^
main.o :main.c
$CC -o $@ -c $^ (-o $@ 可以省略) 当前规则为 gcc -c main.c -o main.o
add.o :add.c
$CC -o $@ -c $^ ( -o S@ 可以省略)当前规则为 gcc -c add.c -o add.o
clean:
rm $(EXE) $(OBJS)
OBJS := main.o add.o
CFLAGS:= -Wall-O2-g
main:$(OBJS)
gcc -o $@ $^
%.o:%.c
gcc -o $@ $^
编译多个目标文件
SRCS = open1.c open2.c
OBJS=$(SRCS:%.c=%.o)
TAR = $(SRCS:%.c=%)
all: $(TAR)
@for i in $(TAR) ;
do gcc -o $$(i} $%{i}.c ;
done
.PHONY:clean
clean :
rm ${TAR}
wildcard 搜索当前目录下的文件名,展开成一列所有符合其参数描述的文件名
SOURCES= $(wildcard *.c) 所有.c 文件存入 sources
字符串替换函数$( patsubst 要查找的字串, 替换后的字串,源字串)
OBJS=$(patsubst %.cpp,%.o $(SOURCES)) 把 .cpp 替换成 .o