程式編譯介紹

2021-06-10 18:11:15 字數 2408 閱讀 5502

一。預編譯過程將程式中引用的標頭檔案包含在原始檔中,並對一些巨集進行替換。

二。編譯過程將使用者可識別的語言翻譯成一組處理器可識別的操作碼,生成目標檔案,通常翻譯成組合語言,而組合語言通常和機器碼之間是一種一對一的關係。

三。鏈結將所有的目標檔案通過某種方式組合起來。生成可執行檔案。目標檔案中通常僅解析了檔案內部的變數和函式,對於引用的函式和變數還沒有解析,這就需要將其他已經寫好的目標檔案引用進來將沒有解析的變數和函式進行解析,通常引用的目標是庫。鏈結完成後會生成可執行檔案。

gcc -c -o myfile.o demo.c //用於生成demo.c的目標檔案,且被命名為myfile.o,因為.o是目標檔案的副檔名,-c用於生成目標檔案,-o用於指定要被命名的名字。

gcc -e demo.c //用於檢視預處理後的檔案內容。

gcc -s demo.c //對demo.c預編譯後進行編譯,生成.s副檔名的檔案。

gcc -idir //i為i的大寫,表示用dir作為乙個尋找標頭檔案的目錄,搜尋路徑為dir->/usr/include-->/usr/local/include

gcc -ldir//表示將dir目次作為第乙個尋找庫檔案的目次,尋找的次序是:dir-->/lib-->/usr/lib-->/usr/local/lib

gcc -lworld//l為l的小寫,表示在-l指定的路徑中去查詢指定的動態鏈結庫libworld.so,若在編譯中加入引數-static,表示尋找的是靜態鏈結庫libworld.a

建立靜態庫,可以用ar程式,如

ar -rcs demolib.a demo.o //將demo.o目標檔案放到demolib庫中。

在需要的時候,比如main.c中用到了funlib.a中的函式,可以這樣編譯

gcc -o mydemo main.c funlib.a 即可

gcc dynloadfun.c -o dyn -ldl

注意:一。要編譯引用了動態鏈結庫的源**檔案,步驟有3個

1。gcc -shared -wl,-soname,libwandan.so -o libwandan.so.1 func.c

建立動態連線庫檔案。用-soname,mylibname 去註明要生成的別名

2。sudo ldconfig ~/ctest/

加入動態鏈結庫快取檔案中。

3。gcc -o wandan main.c -lwandan -l./

編譯,指定動態鏈結庫檔案,並指明所在目錄

4。./wandan

二。在**中動態呼叫動態鏈結庫的函式時,在編譯時

1。gcc -shared -wl,-soname,libwandan.so -o libwandan.so.1 func.c

建立動態連線庫檔案。用-soname,mylibname 去註明要生成的別名

2。sudo ldconfig ~/ctest/

加入動態鏈結庫快取檔案中。

3。gcc dynloadfun.c -o dyn -ldl

加上-ldl,表明需要引用動態鏈結庫

三。除了上面gcc用到的引數外,比較常用的還有。

-i :表示將標頭檔案的搜尋路徑變大 ,如-idir

-l:表示將動態鏈結庫的搜尋路徑變大,如-ldir

四。既可以在編譯時鏈結動態庫也可以在程式中,即執行時候動態載入動態鏈結庫檔案,指定呼叫函式。

[編譯時指定:要指定動態庫的路徑,並且需要指定動態庫的名稱。]

[執行時載入:只要在編譯的時候加-ldl引數即可。]

通過man dlopen 可以看到幫助手冊中有:

#include void *dlopen(const char *filename, int flag);

char *dlerror(void);

void *dlsym(void *handle, const char *symbol);

int dlclose(void *handle);

link with -ldl. //表明鏈結時候直接加引數-ldl即可。

例子:#include #include //動態載入庫

int main(void)

else

perr = dlerror();

if(!perr)

else

pfunc = dlsym(phandle , "calcstringlength");

perr = dlerror();

if(!perr)

else

printf("the string length = %d\n",pfunc(str));

dlclose(phandle);

return 0;

}

翻譯介紹15個經典的MDX查詢 04 05

04,最近銷售趨勢最好的產品有哪些?查詢listing 4首先利用topcount 查得銷售最好的產品,然後利用上個查詢listing 3 介紹過的動態時間技巧定義最近6個月的銷售量。該查詢安排在行顯示銷售最好的10種產品,列顯示最近的6個月,值區域為這6個月的unit sales。你可以用線狀圖展...

翻譯介紹15個經典的MDX查詢 02and03

02.所有商店中銷售前10名的產品類別有哪些?listing 2 直接利用topcount 函式查詢銷售前10名的產品。這是一種最直接的方法,topcount 函式本身自帶排序 降序 的功能 listing 2 determining top 10 product categories 說明 查詢銷...

編譯原理介紹

把某一種語言程式 稱為源語言程式 等價地轉換 成另一種語言程式 稱為目標語言程式 的程式 高階語言程式需要編譯程式的翻譯才能變成機器語言程式 目標程式 機器程式可以執行成為結果 編譯程式 1.診斷編譯程式 diagnostic compiler 2.優化編譯程式 optimizing compile...