当前位置: 首页 > news >正文

Linux下C程序的编写

Linux下C程序的编写

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

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

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

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

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

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

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

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

greeting.h(头文件):

// greeting.h  
#ifndef GREETING_H  
#define GREETING_H  void print_greeting();  #endif // GREETING_H

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

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

myapp.c(主函数文件):

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

然后,我们编写一个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命令。

编译程序:

make

执行程序:

./myapp

清理生成的文件:

make clean

相关文章:

  • 如何安全进行亚马逊、沃尔玛测评?
  • 【vue】终端 常用代码 和其他注意
  • 提高磁盘I/O速度的途径
  • 【C++】AVL树/红黑树实现及map与set的封装
  • 龙芯+RT-Thread+LVGL实战笔记(36)——密码锁完善
  • java实现两个不同对象的集合复制
  • Unity | Shader基础知识(第十四集:简单效果练习)
  • 22.2 正则表达式-数据验证、数据变换
  • 广东工业大学领导一行莅临泰迪智能科技参观交流
  • 分数布朗运动FBM期权定价模型
  • SpringCloud 网关Gateway配置并使用
  • .NET MAUI Sqlite程序应用-数据库配置(一)
  • Luma AI如何注册:文生视频领域的新星
  • target目录的文件上传controller,无需做静态映射。以及上传路径配置
  • TQZC706开发板教程:10G光口ping测试
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • ECS应用管理最佳实践
  • Facebook AccountKit 接入的坑点
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • JavaWeb(学习笔记二)
  • java第三方包学习之lombok
  • MySQL几个简单SQL的优化
  • Redis的resp协议
  • SpiderData 2019年2月16日 DApp数据排行榜
  • ubuntu 下nginx安装 并支持https协议
  • Xmanager 远程桌面 CentOS 7
  • 对象引论
  • 缓存与缓冲
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 微信小程序开发问题汇总
  • postgresql行列转换函数
  • python最赚钱的4个方向,你最心动的是哪个?
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 浅谈sql中的in与not in,exists与not exists的区别
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • 选择阿里云数据库HBase版十大理由
  • # linux从入门到精通(三)
  • #WEB前端(HTML属性)
  • (1)svelte 教程:hello world
  • (arch)linux 转换文件编码格式
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (HAL库版)freeRTOS移植STMF103
  • (力扣题库)跳跃游戏II(c++)
  • (算法)Game
  • (五)activiti-modeler 编辑器初步优化
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (一)RocketMQ初步认识
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .form文件_一篇文章学会文件上传
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .net core 6 redis操作类
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上