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