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
相关推荐
你好,赵志伟6 分钟前
Socket 编程 TCP
linux·服务器·tcp/ip
Liang_GaRy1 小时前
心路历程-三个了解敲开linux的大门
linux·运维·服务器
星霜笔记2 小时前
Docker 部署 MariaDB+phpMyAdmin+Nextcloud 完整教程
运维·数据库·docker·容器·mariadb
一只栖枝5 小时前
华为 HCIE 大数据认证中 Linux 命令行的运用及价值
大数据·linux·运维·华为·华为认证·hcie·it
wuicer7 小时前
ubuntu 20.04 安装anaconda以及安装spyder
linux·运维·ubuntu
cui__OaO9 小时前
Linux软件编程--线程
linux·开发语言·线程·互斥锁·死锁·信号量·嵌入式学习
小狗爱吃黄桃罐头9 小时前
正点原子【第四期】Linux之驱动开发篇学习笔记-1.1 Linux驱动开发与裸机开发的区别
linux·驱动开发·学习
小晶晶京京9 小时前
day34-LNMP详解
linux·运维·服务器
画个太阳作晴天9 小时前
A12预装app
linux·服务器·前端
艾莉丝努力练剑10 小时前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法