c语言linux宏
⑴ linux怎么运行c程序
CC是Linux操作系统下一个非常重要的源代码编译工具,有着许多重要的选项,支持许多不同语言的编译,如C、C++、Ada、Fortran、Objective、Perl、Python、Ruby以及Java等,甚至Linux的许多内核和许多其他自由软件以及开放源码应用程序都是用C语言编写并经gcc编译而成的.
1.编译单个源文件
[例如]在屏幕上打印"Hello,Linux."
[源代码]
#include<stdio.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
printf("Hello,Linux.\n");
exit(0);
}
将源文件保存为hello.c,开始进行编译
$gcc -o hello hello.c
编译成功完成后,在当前路径下,生成一个名为hello的文件,然后执行
$./hello
在屏幕上,你将会看到打印结果:Hello,Linux.
说明:在默认情况下,编译成功完成后,会在当前路径下,生成一个名为a.out的文件,然后执行$./a.out便可打印结果,但通常可以通过选项-o来指定自己的可执行程序名称;
2.编译多个源文件
3.使用外部函数库
4.使用共享函数库和静态函数库
5.gcc选项详细描述
1.7.2 gcc/egcs 的主要选项
表 1-3 gcc 命令的常用选项
选项 解释
-ansi 只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色,
例如 asm 或 typeof 关键词。
-c 只编译并生成目标文件。
-DMACRO 以字符串“1”定义 MACRO 宏。
-DMACRO=DEFN 以字符串“DEFN”定义 MACRO 宏。
-E 只运行 C 预编译器。
-g 生成调试信息。GNU 调试器可利用该信息。
-IDIRECTORY 指定额外的头文件搜索路径DIRECTORY。
-LDIRECTORY 指定额外的函数库搜索路径DIRECTORY。
-lLIBRARY 连接时搜索指定的函数库LIBRARY。
-m486 针对 486 进行代码优化。
-o FILE 生成指定的输出文件。用在生成可执行文件时。
-O0 不进行优化处理。
-O 或 -O1 优化生成代码。
-O2 进一步优化。
-O3 比 -O2 更进一步优化,包括 inline 函数。
-shared 生成共享目标文件。通常用在建立共享库时。
-static 禁止使用共享连接。
-UMACRO 取消对 MACRO 宏的定义。
-w 不生成任何警告信息。
-Wall 生成所有警告信息。
⑵ 如何用C语言做一个五子棋(Linux)
在大学的C语言课程中,我遇到了一个挑战。教材上的内容过于简单,无法满足我爱玩、爱创造的天性。因此,我决定利用所学知识,制作一个Linux平台下的双人五子棋游戏。经过多次迭代优化,游戏已经升级到0.8版本。下面,我将分享我的制作过程与心路历程。
游戏的实现从头文件、宏定义、全局变量和常量的定义开始。为了适应Linux环境,我引入了头文件,用于实现终端操作。同时,使用宏定义来定义常量,如棋子数量等,以提升代码的可读性和维护性。
游戏包含了多个关键函数:`envir()`用于构建棋盘,`print()`用于显示棋盘和信息,`Icon()`实现光标移动与棋子放置,`checkchess()`用于检测赢家,而`getch()`则是基于Linux环境的替代方案,以实现游戏操作。
最初的版本中,游戏仅使用了两个数组,一个用于输出棋盘状态,另一个用于检测玩家的行动。UTF-8字符的棋盘设计,让游戏界面显得更为美观。
主函数`Main()`负责整合游戏流程,包括棋盘构建、游戏交互、结果显示等步骤。`envir()`函数以特定顺序输出棋盘,`print()`函数则按照既定规则显示棋盘、回合信息及光标位置。`Icon()`函数整合了光标控制、棋子放置、游戏逻辑判断等功能。
`checkchess()`函数采用简单的穷举法,通过检查数组来判定胜利条件。`getch()`函数的实现则依赖于网络资源,以适应Linux环境的操作需求。
随着版本迭代,游戏功能得到了增强,包括增加方向键控制、悔棋功能、增加欢迎界面等。同时,界面设计也得到了优化,如在光标位于棋子位置时显示光标而非棋子,提升游戏体验。此外,还实现了光标闪烁、棋盘局部刷新等功能,让游戏界面更加生动。
在0.8版本中,游戏的核心逻辑和界面设计得到了进一步优化,尽管字符界面和AI功能仍待完善。通过制作游戏,我深刻体会到编程语言的实践应用,学习过程中的问题解决能力也得到了提升。游戏不仅为我提供了学习和创造的平台,也让我享受到编程的乐趣。
总之,通过亲手制作游戏,我不仅加深了对C语言的理解,还培养了解决实际问题的能力。这是一次非常宝贵的学习经历,我强烈推荐所有对编程感兴趣的同学尝试制作游戏,这将有助于在实践中学习和成长。
⑶ Linux内核根目录中的配置文件.config中包含了许多宏定义,
一、Linux内核的配置系统由三个部分组成,分别是:
1、Makefile:分布在 Linux 内核源代码根目录及各层目录中,定义 Linux 内核的编译规则;
2、配置文件(config.in(2.4内核,2.6内核)):给用户提供配置选择的功能;
3、配置工具:包括配置命令解释器(对配置脚本中使用的配置命令进行解释)和配置用户界面(提供基于字符界面、基于 Ncurses 图形界面以及基于 Xwindows 图形界面的用户配置界面,各自对应于 Make config、Make menuconfig 和 make xconfig)。这些配置工具都是使用脚本语言,如 Tcl/TK、Perl 编写的(也包含一些用 C 编写的代码)。本文并不是对配置系统本身进行分析,而是介绍如何使用配置系统。所以,除非是配置系统的维护者,一般的内核开发者无须了解它们的原理,只需要知道如何编写 Makefile 和配置文件就可以。
二、Make menuconfig过程分析
1、scripts文件夹存放的是跟make menuconfig配置界面的图形绘制相关的文件,我们作为使用者无需关心这个文件夹的内容
2、读取arch/arch/$ARCH/Kconfig以及各子目录下的Kcondig文件,生成配置条目。
$ARCH由linux内核根目录下的makefile文件决定
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
Kconfig文件中为配置信息的宏定义,与我们在make menuconfig图形界面看到的信息一致。
例如:
config CPU_S3C2410_DMA
bool
depends on S3C2410_DMA && (CPU_S3C2410 || CPU_S3C2442)
default y if CPU_S3C2410 || CPU_S3C2442
help
DMA device selection for S3C2410 and compatible CPUs
因此,Kconfig文件很重要的作用就是:定义配置宏、相关依赖关系、帮助信息
3、读取内核根目录下.config文件,生成配置选项:[*]编译进内核 [M]编译为模块 [ ]不编译
arch/arm/configs/文件夹下存放了一些配置模板
我们可以通过cp /arch/arm/configs/xx_defconfig .config来使用这些配置模板
通过图形界面变更配置选项会自动更新到.config文件中
make disclean 会删除.config
4、编译过程根据.config生成 Linux内核根目录下的 include/config/auto.conf文件
CONFIG_EEPROM_93CX6=m
CONFIG_DM9000=y
根目录Makefile以及子目录的Makefile根据auto.conf生成编译条件
obj-$(CONFIG_DM9000) += dm9000.o //obj-m += dm9000.o
5、编译过程根据.config生成Linux内核根目录下的 include/linux/autoconf.h文件
.config 或 auto.conf 中定义要编译为 m 模块的项,如:
CONFIG_DEBUG_NX_TEST=m
在 autoconf.h 中会被定义为:
#define CONFIG_DEBUG_NX_TEST_MODULE 1
.config或auto.conf 中定义为编译为 y 的选项,如:
CONFIG_DM9000= y
在 autoconf.h 中会被定义为:
#define CONFIG_DM9000 1
autoconf.h中是.config或者auto.conf中配置信息的另一种体现形式,它是站在源码的角度,供源码使用的C语言宏定义。
6、总结
我们在使用make menuconfig时,首先会确定架构arch,然后读取arch目录的Kconfig中的配置宏定义,生成编译条目,然后读取Linux内核根目录下的.config选项, 将.config中的配置信息显示在图形界面上[*] [M] or []。我们在图形界面中更改配置选项会自动保存到.config文件中。编译过程根据.config随后生成auto.conf文件,它决定了makefile中各个文件的编译类型,静态编译进内核、编译成模块、不编译;同时生成autoconf.h,它以C语言宏定义的形式表达了 各个文件是否被编译,源码中会判断某文件是否被编译进行不同的处理。
三、将自定义文件添加进内核配置系统
1、修改文件目录下Kconfig文件
添加:
config HELLO
tristate "just a test hello"
default y
---help---
This is a test
//tristate 或 bool 表示可选择种类数量3[*][M][ ]、2
// "just a test hello"将作为标题显示在配置的图形界面
2、修改文件目录下makefile文件
obj-$(CONFIG_HELLO) += hello_drv.o
3、make menuconfig 我们会在字符设备驱动的界面看到 ust a test hello 并且默认编译进内核
4、make编译内核发现
autoconfig.h 自动添加 #define CONFIG_HELLO 1
auto.conf 自动添加 CONFIG_HELLO=y