Linux下C程序的编写

Linux下C程序的编写

第一部分:编写C程序并使用gcc编译器

首先,我们编写一个简单的C程序hello_gcc.c,用于在屏幕上输出"Hello gcc!"。

c 复制代码
// hello_gcc.c  
#include <stdio.h>  
  
int main() {  
    printf("Hello gcc!\n");  
    return 0;  
}

然后,我们可以使用gcc编译器并带上不同的选项来观察生成的文件。

  1. 编译并生成可执行文件(不使用中间文件):
bash 复制代码
gcc hello_gcc.c -o hello_gcc
  1. 编译并生成预处理文件(.i):
bash 复制代码
gcc -E hello_gcc.c -o hello_gcc.i
  1. 编译预处理文件并生成汇编文件(.s):
bash 复制代码
gcc -S hello_gcc.i -o hello_gcc.s  
# 或者直接使用源文件,gcc会先预处理再生成汇编文件  
gcc -S hello_gcc.c -o hello_gcc.s
  1. 编译汇编文件并生成目标文件(.o):
bash 复制代码
gcc -c hello_gcc.s -o hello_gcc.o  
# 或者直接从源文件编译到目标文件  
gcc -c hello_gcc.c -o hello_gcc.o
  1. 链接目标文件并生成可执行文件:
bash 复制代码
gcc hello_gcc.o -o hello_gcc

(注意:在实际操作中,通常不会单独编译汇编文件,而是直接从源文件编译到目标文件。)

第二部分:编写包含多个文件的C程序并编写Makefile

接下来,我们编写一个包含头文件greeting.h、自定义函数文件greeting.c和主函数文件myapp.c的C程序。

greeting.h(头文件):

c 复制代码
// greeting.h  
#ifndef GREETING_H  
#define GREETING_H  
  
void print_greeting();  
  
#endif // GREETING_H

greeting.c(自定义函数文件):

c 复制代码
// greeting.c  
#include <stdio.h>  
#include "greeting.h"  
  
void print_greeting() {  
    printf("Hello from greeting.c!\n");  
}

myapp.c(主函数文件):

c 复制代码
// myapp.c  
#include "greeting.h"  
  
int main() {  
    print_greeting();  
    return 0;  
}

然后,我们编写一个Makefile文件来管理这些文件的编译过程。

Makefile

makefile 复制代码
# Makefile  
CC=gcc  
CFLAGS=-Wall  
  
TARGET=myapp  
SOURCES=$(wildcard *.c)  
OBJECTS=$(SOURCES:.c=.o)  
  
all: $(TARGET)  
  
$(TARGET): $(OBJECTS)  
 $(CC) $(CFLAGS) -o $@ $^  
  
%.o: %.c  
 $(CC) $(CFLAGS) -c $< -o $@  
  
clean:  
 rm -f $(OBJECTS) $(TARGET)

在这个Makefile中,我们定义了编译器(CC)、编译选项(CFLAGS)、目标文件(TARGET)、源文件(SOURCES)、目标文件列表(OBJECTS)。我们还定义了allclean两个目标,分别用于编译和清理生成的文件。

要使用这个Makefile,只需在终端中进入包含Makefile的目录,并运行make命令即可编译程序。要清理生成的文件,可以运行make clean命令。

编译程序:

bash 复制代码
make

执行程序:

bash 复制代码
./myapp

清理生成的文件:

bash 复制代码
make clean
相关推荐
用户805533698037 小时前
主线 U-Boot 上 RK3506:和闭源 rkbin 拔河的三个隐性契约
linux·嵌入式
用户034095297917 小时前
linux fcitx 5 雾凇拼音 设置在中文输入法下仍然输入英文标点
linux
乘云数字DATABUFF7 小时前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
Web3探索者2 天前
可视化服务器管理和传统命令行区别是什么?新手教程:Linux 运维到底该用图形界面还是 SSH 命令行?
linux·ssh
zylyehuo2 天前
Linux系统中网线与USB网络共享冲突
linux
荣--2 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森2 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜3 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
Sokach10153 天前
Linux Shell 脚本从零到能用:一个新手的一天学习总结
linux
SelectDB4 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维