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
相关推荐
宁zz8 小时前
乌班图安装jenkins
运维·jenkins
大丈夫立于天地间8 小时前
ISIS协议中的数据库同步
运维·网络·信息与通信
cg50178 小时前
Spring Boot 的配置文件
java·linux·spring boot
似水এ᭄往昔8 小时前
【C语言】文件操作
c语言·开发语言
暮云星影9 小时前
三、FFmpeg学习笔记
linux·ffmpeg
rainFFrain9 小时前
单例模式与线程安全
linux·运维·服务器·vscode·单例模式
GalaxyPokemon9 小时前
Muduo网络库实现 [九] - EventLoopThread模块
linux·服务器·c++
蒙奇D索大9 小时前
【数据结构】第六章启航:图论入门——从零掌握有向图、无向图与简单图
c语言·数据结构·考研·改行学it
mingqian_chu9 小时前
ubuntu中使用安卓模拟器
android·linux·ubuntu