日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ubuntu下C编程,编译基础( 转)

發布時間:2023/12/2 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ubuntu下C编程,编译基础( 转) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

buntu下C編程,編譯基礎??

?

C 編程中相關文件后綴

.a靜態庫 (archive)
.cC源代碼(需要編譯預處理)
.hC源代碼頭文件
.iC源代碼(不需編譯預處理)
.o對象文件
.s匯編語言代碼
.so動態庫

單個源文件生成可執行程序

下面是一個簡單的“hello, ubuntu”程序的源代碼:

/* helloubuntu.c */
#include <stdio.h>
int main(int argc,char *argv[])
{
printf(“hello, ubuntu\n”);
?
return 0;
}

最簡單直接的編譯該代碼為可執行程序的方法是,將該代碼保存為文件 helloubuntu.c,并執行以下命令:

$ gcc -Wall helloubuntu.c

編譯器通過檢查命令行中指定的文件的后綴名可識別其為 C 源代碼文件。GCC 默認的動作:編譯源代碼文件生成對象文件(object file),鏈接對象文件得到可執行程序,刪除對象文件。由于命令行中未指定可執行程序的文件名,編譯器采用默認的 a.out。在命令行中輸入程序名可使其執行并顯示結果:

$ ./a.out
hello, ubuntu

選項 -o 用來指定所生成的可執行程序的文件名。下面的命令生成名為 helloubuntu 的可執行程序:

$ gcc -Wall helloubuntu.c -o helloubuntu

在命令行中輸入程序名將使其執行,如下:

$ ./helloubuntu
hello, ubuntu

源文件生成對象文件

選項 -c 指示 GCC 編譯源代碼文件,但將對象文件保留在磁盤中并跳過鏈接對象文件生成可執行文件這一步。在這種情況下,默認的輸出文件的文件名同源代碼文件名一致,只不過后綴換為 .o 。例如:下面的命令將生成名為 helloubuntu.o 的對象文件:T

$ gcc -c -Wall helloubuntu.c

選項 -o 可用來指定生成的對象文件的文件名。以下命令將產生名為kubuntu.o的對象文件:

$ gcc -c -Wall helloubuntu.c -o kubuntu.o

當構建對象庫或者生成一系列對象文件以備稍后鏈接用時,一條命令即可從多個源碼文件生成對應的對象文件。下面的命令將生成對象文件ubuntu.o, kubuntu.o 與 xubuntu.o:

$ gcc -c -Wall ubuntu.c kubuntu.c xubuntu.c

多個源文件生成可執行程序

即使多個源碼文件被編譯,GCC編譯器也會自動進行鏈接操作。例如:下面的代碼保存在名為 hellomain.c 的文件中并調用一個名為 sayhello()的函數: /* hellomain.c */
void sayhello(void);
int main(int argc,char *argv[])
{
sayhello();
return 0;
} 以下代碼保存在名為 sayhello.c 的文件中并定義了 sayhello() 函數: /* sayhello.c */
#include <stdio.h>
void sayhello()
{
printf(“hello, ubuntu\n”);
}

下面的命令將兩個文件分別編譯為對象文件且將其鏈接為可執行程序 hello,并刪除對象文件:

$ gcc -Wall hellomain.c sayhello.c -o hello

編譯預處理

選項 -E 指示編譯器只進行編譯預處理。下面的命令將預處理源碼文件 helloubuntu.c 并將結果在標準輸出中列出:

$ gcc -E helloubuntu.c

選項 -o 用來將預處理過的代碼定向到一個文件。像本文一開始給出的后綴列表所給出的,不需經過預處理的C源碼文件保存為后綴為 .i的文件中,這種文件可以這樣來獲得:

$ gcc -E helloubuntu.c -o helloubuntu.i

生成匯編代碼

選項 -S 指示編譯器生成匯編語言代碼然后結束。下面的命令將由 C 源碼文件 helloubuntu.c 生成匯編語言文件 helloubuntu.s:

$ gcc -S helloubuntu.c

匯編語言的形式依賴于編譯器的目標平臺。如果多個源碼文件被編譯,每個文件將分別產生對應的匯編代碼模塊。

創建靜態庫

靜態庫是編譯器生成的普通的 .o 文件的集合。鏈接一個程序時用庫中的對象文件還是目錄中的對象文件都是一樣的。靜態庫的另一個名字叫歸檔文件(archive),管理這種歸檔文件的工具叫 ar 。

要構建一個庫,首先要編譯出庫中需要的對象模塊。例如,下面的兩個源碼文件為 hellofirst.c 和 hellosecond.c:

/* hellofirst.c */
#include <stdio.h>
void hellofirst()
{
printf(“The first hello\n”);
}
/* hellosecond.c */
#include <stdio.h>
void hellosecond()
{
printf(“The second hello\n”);
}

這兩個源碼文件可以用以下命令編譯成對象文件:

$ gcc -c -Wall hellofirst.c hellosecond.c

程序 ar 配合參數 -r 可以創建一個新庫并將對象文件插入。如果庫不存在的話,參數 -r 將創建一個新的,并將對象模塊添加(如有必要,通過替換)到歸檔文件中。下面的命令將創建一個包含本例中兩個對象模塊的名為 libhello.a 的靜態庫:

$ ar -r libhello.a hellofirst.o hellosecond.o 現在庫已經構建完成可以使用了。下面的程序 twohellos.c 將調用該庫中的這兩個函數: /* twohellos.c */
void hellofirst(void);
void hellosecond(void);
int main(int argc,char *argv[])
{
hellofirst();
hellosecond();
return 0;
}

程序 twohellos 可以通過在命令行中指定庫用一條命令來編譯和鏈接,命令如下:

$ gcc -Wall twohellos.c libhello.a -o twohellos

靜態庫的命名慣例是名字以三個字母 lib 開頭并以后綴 .a 結束。所有的系統庫都采用這種命名慣例,并且它允許通過 -l(ell) 選項來簡寫命令行中的庫名。下面的命令與先前命令的區別僅在于 gcc 期望的找尋該庫的位置不同:

$ gcc -Wall twohellos.c -lhello -o twohellos

指定完整的路徑名可使編譯器在給定的目錄中尋找庫。庫名可以指定為絕對路徑(比如 /usr/worklibs/libhello.a)或者相對與當前目錄的路徑(比如 ./lib/libhello.a)。選項 -l 不能具有指定路徑的能力,但是它要求編譯器在系統庫目錄下找尋該庫。

創建共享庫

共享庫是編譯器以一種特殊的方式生成的對象文件的集合。對象文件模塊中所有地址(變量引用或函數調用)都是相對而不是絕對的,這使得共享模塊可以在程序的運行過程中被動態地調用和執行。

要構建一個共享庫,首先要編譯出庫中需要的對象模塊。例如:下面是文件名為 shellofirst.c 和 shellosecond.c 的兩個源碼文件: /* shellofirst.c */
#include <stdio.h>
void shellofirst()
{
printf(“The first hello from a shared library\n”);
}
/* shellosecond.c */
#include <stdio.h>
void shellosecond()
{
printf(“The second hello from a shared library\n”);
}

要將以上兩個源碼文件編譯成對象文件,可以用下面的命令:

$ gcc -c -Wall -fpic shellofirst.c shellosecond.c

選項 -c 告訴編譯器只生成 .o 的對象文件。選項 -fpic 使生成的對象模塊采用浮動的(可重定位的)地址。縮微詞 pic 代表“位置無關代碼”(position independent code)。

下面的 gcc 命令將對象文件構建成一個名為 hello.so 的共享庫:

$ gcc -Wall -shared shellofirst.o shellosecond.o -o hello.so

選項 -o 用來為輸出文件命名,而文件后綴名 .so 告訴編譯器將對象文件鏈接成一個共享庫。通常情況下,鏈接器定位并使用 main() 函數作為程序的入口,但是本例中輸出模塊中沒有這種入口點,為抑制錯誤選項 -shared 是必須的。

編譯器能將后綴為 .c 的文件識別為 C 語言源代碼文件,并知道如何將其編譯成為對象文件。基于這一點,先前的兩條命令我們可以合并為一條;下面的命令直接將模塊編譯并存儲為共享庫:

$ gcc -Wall -fpic -shared shellofirst.c shellosecond.c -o hello.so 下面的程序,存儲在文件 stwohellos.c 內,是調用共享庫中兩個函數的主程序: /* stwohellos.c */
void shellofirst(void);
void shellosecond(void);
int main(int argc,char *argv[])
{
shellofirst();
shellosecond();
return 0;
}

該程序可以用下面的命令編譯并鏈接共享庫:

$ gcc -Wall stwohellos.c hello.so -o stwohellos

程序 stwohello 已經完成,但要運行它必須讓其能定位到共享庫 hello.so,因為庫中的函數要在程序運行時被加載。

超越命名慣例

如果環境要求你使用 .c 以外的后綴名來命名你的 C 源碼文件,你可以通過 -x 選項來指定其對應的語言以忽略我們的命名規范。例如,下面的命令將從文件 helloworrld.jxj 編譯 C 語言源代碼并生成可執行文件 helloubuntu:

$ gcc -xc helloubuntu.jxj -o helloubuntu

通常,在沒有 -x 選項的情況下,任何具有未知后綴名的源碼文件名都被認為是連接器可以識別的選項,并在不做任何更改的情況下傳遞給鏈接器。選項 -x 對其后的所有未知后綴的文件都起作用。例如,下面的命令使 gcc 將 align.zzz 和 types.xxx 都作為 C 源碼文件來處理:

$ gcc -c -xc align.zzz types.xxx

轉載于:https://www.cnblogs.com/yaopan007/p/3481891.html

總結

以上是生活随笔為你收集整理的ubuntu下C编程,编译基础( 转)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。