Linux C编程

1 设定当前的vim编译器

  • 设定文件夹的<tab>键默认四格,操作如下图:
复制代码
sudo vi /etc/vim/vimrc
#在最后一行输入
set ts =4
  • 设定当前的vim编译器显示行号

同上在最后一行加上

复制代码
set nu

2 开始第一个C文件

编写一个简单输出为hello world的C文件并且通过编译链接的方式输出可执行文件。

复制代码
sudo touch main.c

sudo vi main.c

#include <stdio.h>
int main(int argc,char *argv[])
{
    printf("hello world!\r\n");
    return 0;
}

首先要经过如下四个步骤具体概念可以看这个文章https://zhuanlan.zhihu.com/p/476697014

gcc -E main.i main.c不会输出main.i文件而是在窗口中直接输出转换后文件,如果想要输出.i文件必须使用gcc -E main.c -o main.i理由如下:

  • gcc -E:默认将预处理结果输出到标准输出,不会自动创建 .i 文件。如果需要生成 .i 文件,需要显式指定输出文件。
  • gcc -S:默认会生成一个 .s 文件,包含汇编代码

gcc编译器也支持一步到位即gcc hello.c -o hello 或者 gcc hello.c会直接输出同名文件;并且上述的步骤也可以跳过,不用顺序执行,比如可以直接gcc -c hello.c -o hello.o

或者 gcc -c hello.c均会输出 hello.o文件。

通过如下命令可以看到每个产生的文件

复制代码
gcc -E main.c -o main.i
gcc -S main.i -o main.s
gcc -c main.s -o main.o
gcc main.o -o main

如果执行多个.c文件时需要链接多个,例如实现三个文件main.c input.c cal.c实现两数相加,分别如下

main.c

复制代码
#include <stdio.h>
int main(int argc,char *argv[])
{
    printf("hello world!\r\n");
    return 0;
}

cal.c

复制代码
#include <stdio.h>
int cal(int a, int b) {
    return a + b;
}

cal.h

复制代码
#ifndef _CAL_H_
#define _CAL_H_
int cal(int a, int b);
#endif

input.c

复制代码
#include <stdio.h>
void input(int *x, int *y) {
    scanf("%d,%d", x, y);
}

input.h

复制代码
#ifndef _INPUT_H_
#define _INPUT_H_
void input(int *x, int *y);
#endif

为了方便可以直接使用gcc -c main.c input.c cal.c会得到3个同名的.o文件

则main.o input.o cal.o,再将这三个文件链接gcc main.o input.o cal.o -o main 或者

gcc -o main main.o input.o cal.o都行。

3 Makefile的使用

Makefile可以用于简化或更加方便上述编译步骤,当你使用第一个输出为hello world时想要完整的输出步骤中的全部文件可以按如下步骤

复制代码
sudo touch Makefile

sudo vi Makefile

main: main.o
    gcc main.o -o main
main.o: main.s
    gcc -c main.s -o main.o
main.s: main.i
    gcc -S main.i -o main.s
main.i: main.c
    gcc -E main.c -o main.i
clean:
    rm -f main main.o main.s main.i

后直接用下面命令即可,且makefile只对更改了的文件进行编译,大幅降低编译所需时间。

复制代码
make 

当你想链接三个文件时Makefile可以按如下编写

复制代码
main:main.o input.o cal.o
    gcc -o main main.o input.o cal.o #gcc main.o input.o cal.o -o main
main.o:main.c
    gcc -c main.o main.c #gcc -c main.c -o main.o
input.o:input.c
    gcc -c input.o input.c #gcc -c input.c -o input.o
cal.o:cal.c
    gcc -c cal.o cal.c #gcc -c cal.c -o cal.o

如果发生确实分隔符的报错,请检查是否用了<tab>键,如果用了则没问题,没用则将改行前面空格删除用<tab>替代。

为了更加方便可以用变量代替上面所需内容

复制代码
target = main.o input.o cal.o
depend = main.c input.c cal.c
main: $(target)
    gcc -o main main.o input.o cal.o
$(target): $(depend)
    gcc -c $(depend)
相关推荐
whyutianict_vv1 小时前
云计算 HCIE 认证体系解析:HCIA/HCIP/HCIE 三级科目与知识边界
linux·运维·云计算
0+1118 小时前
Linux --从 poll 到 epoll多路转接
linux·服务器·1024程序员节
青瓦梦滋8 小时前
WebSocket协议
linux·服务器·网络·c++·websocket·网络协议·http
桌面运维家9 小时前
旧电脑跑不动课程软件,VDI云桌面怎样接着用?
运维·服务器·虚拟化·pve·vdi·云桌面
zhang133830890759 小时前
传统机械三杯式风速传感器易磨损冻堵?CG-88金属超声波风速风向传感器给出免运维方案
运维·服务器·网络·人工智能·自动化
知已难寻9 小时前
第 2 篇 · 云的地基:服务器、存储、网络三大基础设施
运维·服务器·网络·云原生·云计算·负载均衡·1024程序员节
2601_9498477512 小时前
bcrypt.js 跨端三方库仓颉适配全流程
linux·运维·ubuntu
m0_6399069412 小时前
Linux 操作系统入门:目录结构、服务排查常用命令、Shell 脚本基础
linux·运维·后端
今天重构了吗12 小时前
Linux 上 rm -rf 删错了能找回吗
运维·服务器
KaiwuDB12 小时前
KaiwuDB 分布式集群扩缩容,从原理到完整操作踩坑总结
运维·数据库·分布式