




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、嵌入式Linux GCC培訓(xùn)主講老師: 歐陽(yáng)堅(jiān)嵌入式Linux GCC培訓(xùn)主講老師: 歐陽(yáng)堅(jiān)GCC是什么?GCC: GNU Compiler Collection;GCC支持多種硬件平臺(tái)和操作系統(tǒng),能編譯多種語(yǔ)言(C, C+, Java, Ada95, Objective C, .etc);GCC與G+的關(guān)系:GCC用于編譯多種語(yǔ)言編寫(xiě)的程序,主要是C;G+用于編譯C+程序,以GCC為基礎(chǔ),編譯過(guò)程中加入了C+的支持庫(kù),參數(shù)與GCC基本一致;可以利用GCC編譯C+程序,但是需要在參數(shù)中加入引用的C+庫(kù),比如libstdc+ (如gcc -o out lstdc+ main.cc)。GCC是什么
2、?GCC: GNU Compiler Colle可執(zhí)行程序的生成過(guò)程預(yù)處理(Preprocessing):分析各種預(yù)處理命令,如#define, #include, #if等;編譯(Compilation): 根據(jù)輸入文件產(chǎn)生匯編語(yǔ)言的程序;匯編(Assembly): 將匯編語(yǔ)言輸入,產(chǎn)生擴(kuò)展名為.o的目標(biāo)文件;鏈接(Linking):以.o目標(biāo)文件,庫(kù)文件作為輸入,生成可執(zhí)行文件;源程序文件(.h, .c, .cc, .etc)經(jīng)預(yù)處理的文件(.i, .ii)匯編語(yǔ)言文件(.s)目標(biāo)文件(.o)可執(zhí)行程序(.out)可執(zhí)行程序的生成過(guò)程預(yù)處理(Preprocessing):分GCC支持的文件
3、類(lèi)型C文件.cC源代碼.hC頭文件C+文件file.hh, file.hC+頭文件file.C, file.cc, file.cxx等C+源文件預(yù)處理后的文件file.i預(yù)處理后的C源文件file.ii預(yù)處理后的C+源文件編譯后的文件.o目標(biāo)代碼 (obj).s匯編代碼文件file.a目標(biāo)文件庫(kù)GCC支持的文件類(lèi)型C文件.GCC編譯選項(xiàng)命令行:gcc options infile-E不生成文件,只輸出預(yù)處理結(jié)果(輸出終端)-S只預(yù)處理和編譯,把文件編譯成為匯編代碼greet.s-c預(yù)處理,編譯和匯編,生成.o的obj文件 ( greet.o )-o file輸出名為file的可執(zhí)行文件名 (缺
4、省為a.out)-O-O2優(yōu)化編譯-g: 產(chǎn)生可用于調(diào)試的輸出-Wall提示更多警告信息 -Wstrict-prototypes如果函數(shù)的聲明或定義沒(méi)有指出參 數(shù)類(lèi)型,編譯器就發(fā)出警告. -Wl,option 將option作為選項(xiàng)傳遞給linker, option 逗號(hào)分割, 如:-Wl,-soname,libmymath.so.1GCC編譯選項(xiàng)命令行:gcc options infile與庫(kù)和路徑相關(guān)選項(xiàng)-I dir 在dir這個(gè)目錄尋找被include的文件-L dir 在dir這個(gè)目錄尋找被-l的庫(kù)-l name 鏈接庫(kù)文件名為libname.a 或libname.so的庫(kù)-fpic或
5、-fPIC 產(chǎn)生位置無(wú)關(guān)的目標(biāo)代碼,以構(gòu)造共 享庫(kù)(shared library)-static 禁止與共享庫(kù)鏈接,若沒(méi)有,則優(yōu)先 選擇共享庫(kù)鏈接-shared 產(chǎn)生共享庫(kù),在創(chuàng)建共享函數(shù)庫(kù)時(shí)使用與庫(kù)和路徑相關(guān)選項(xiàng)-I dir 在dir這個(gè)目錄尋找示例示例與宏相關(guān)的選項(xiàng)-Dmacro: 相當(dāng)于在源程序中使用 #define macro 1-Dmacro=value-Umacro: 取消宏的定義與宏相關(guān)的選項(xiàng)-Dmacro: 相當(dāng)于在源程序中使用C語(yǔ)言gcc強(qiáng)化訓(xùn)練2課件3. GCC編譯過(guò)程3. GCC編譯過(guò)程3.1 GCC編譯過(guò)程 典型的編譯過(guò)程 test.c 預(yù)處理 test.i 編譯 te
6、st.s 匯編test.o 連接 test$ cat test.c (查看程序源代碼) #include int main(int argc, char *argv) printf(hello worldn); return 0; $ gcc o test test.c (編譯連接程序)$ ./test (執(zhí)行test程序)3.1 GCC編譯過(guò)程 典型的編譯過(guò)程3.2 預(yù)處理預(yù)編譯命令: $ gcc -o test.i -E test.c或者 $ cpp -o test.i test.c 這里cpp不是值c plus plus,而是the C Preprocessor)執(zhí)行結(jié)果: 生成預(yù)處理后
7、的文件test.i, 該文件包含了test.c需要的所有的類(lèi)型和函數(shù)申明。原理:讀取c源程序,對(duì)偽指令和特殊符號(hào)進(jìn)行處理。包括宏,條件編譯,包含的頭文件,以及一些特殊符號(hào)?;旧鲜且粋€(gè)替換的過(guò)程。3.2 預(yù)處理Hello.c#include int main(void) printf(“hellon”);預(yù)處理命令gcc E hello.c gcc E hello.c o hello.i注釋這一行看看預(yù)處理的結(jié)果注意#include的作用和用途-E表示做預(yù)處理-o 表示預(yù)處理的輸出存于hello.i文件中,而不是屏幕上Hello.c#include 注釋這一行#define用法#include
8、 #define AA 100int main(void) AA BB printf(“hellon”);預(yù)處理命令gcc E hello.c DBB=hellogcc E hello.c DBB=“printf(”hello”);”gcc E hello.c DBB (等效于-DBB=1)注釋這一行看看預(yù)處理的結(jié)果-D表示在命令行中傳入宏定義-DBB=后面是一個(gè)宏的定義,可以加雙引號(hào)。#define用法#include 注釋這#define帶參數(shù)#include #define AA(a,b) a = bint main(void) AA(int a, 1); BB; printf(“hel
9、lon”);預(yù)處理命令gcc E hello.c DBB=hellogcc E hello.c DBB=“printf(”hello”);”注釋這一行看看預(yù)處理的結(jié)果-D表示在命令行中傳入宏定義-DBB=后面是一個(gè)宏的定義,可以加雙引號(hào)。展開(kāi)就成了: int a = 1; AA宏帶兩個(gè)參數(shù)#define帶參數(shù)#include 注釋#ifdef #if defined #if !defined #ifndef#elif defined #elif !defined #else#if #elif #endif-E D”AA=100”#ifdef #if defined #if #define帶參數(shù)
10、#include #ifdef AAaa#elif defined BBbb#elif defined CCcc#elseother#endifint main(void) printf(“hellon”);#ifdef AA 等效于#if defined AA表示當(dāng)定義了宏AA表示除此之外的情況表示否則定義了宏CC的情況#define帶參數(shù)#include #igcc E hello.c DAA=1aaint main(void) printf(“hellon”);gcc E hello.c DAA=1gcc E hello.c DBB=1bbint main(void) printf(“h
11、ellon”);gcc E hello.c DBB=1gcc E hello.c DCC=1ccint main(void) printf(“hellon”);gcc E hello.c DCC=1gcc E hello.cotherint main(void) printf(“hellon”);gcc E hello.c#if使用#if使用#define帶參數(shù)#include #if AAaa#elif BBbb#elif CCcc#elseother#endifint main(void) printf(“hellon”);#if AA 表示AA非零的情況也就是AA除了0其它數(shù)字都為真表示
12、除此之外的情況#elif BB 表示BB非零的情況#elif表示否則如果#define帶參數(shù)#include #igcc E hello.c DAA=1aaint main(void) printf(“hellon”);gcc E hello.c DAA=0otherint main(void) printf(“hellon”);gcc E hello.c DAA=1aagcc E hello.c DBB=1bbint main(void) printf(“hellon”);gcc E hello.c DBB=0otherint main(void) printf(“hellon”);gcc
13、E hello.c DBB=1bbgcc E hello.c DCC=1ccint main(void) printf(“hellon”);gcc E hello.c DCC=0otherint main(void) printf(“hellon”);gcc E hello.c DCC=1ccgcc E hello.cotherint main(void) printf(“hellon”);gcc E hello.c#的用法在函數(shù)式宏定義中,#運(yùn)算符用于創(chuàng)建字符串,#運(yùn)算符后面應(yīng)該跟一個(gè)形參(中間可以有空格或Tab),例如:#define STR(s) # schar *p = STR(hel
14、loworld)結(jié)果變成: char *p = “helloworld”#的用法在函數(shù)式宏定義中,#的用法在宏定義中可以用#運(yùn)算符把前后兩個(gè)預(yù)處理Token連接成一個(gè)預(yù)處理Token,和#運(yùn)算符不同,#運(yùn)算符不僅限于函數(shù)式宏定義,變量式宏定義也可以用。例如:#define FOO(a) foo#aint a = FOO(bar);int b = FOO();預(yù)處理之后變成:int a = foobar;int b = foo;#的用法在宏定義中可以用#運(yùn)算符把前后兩個(gè)預(yù)處理Toke預(yù)處理頭文件xxx.h#ifndef HEADER_FILENAME#define HEADER_FILENAME
15、/* body of header */#endif當(dāng)xxx.h被多次包含的時(shí)候。預(yù)處理頭文件xxx.h#ifndef HEADER_FILE有三個(gè)頭文件和一個(gè)C文件common.h file2.h file3.h main.c有三個(gè)頭文件和一個(gè)C文件common.h file2.h common.h#ifndef _COMMON_H_#define _COMMON_H_ 1static int test(void) printf(“hello n”);#endif 如果沒(méi)有寫(xiě)上紅色部分的,是什么情況。common.h#ifndef _COMMON_H_file1.hfile1.h文件內(nèi)容如下
16、#include “common.h”file2.h文件內(nèi)容如下#include “common.h”file1.hfile1.h文件內(nèi)容如下main.cmain.c內(nèi)容如下/#include #include “file1.h”#include “file2.h”int main(void) test();main.cmain.c內(nèi)容如下gcc E main.cgcc o main main.c./main# # .gcc E main.c#include #include #include “common.h”#include “file1.h”#include C語(yǔ)言gcc強(qiáng)化訓(xùn)練2課件
17、3.3 編譯及優(yōu)化編譯命令: $ gcc -o test.s -S test.i (-S編譯選項(xiàng)) $ gcc -o test.s -S test.i (-S編譯選項(xiàng)) $ cc1 -o test.s test.i (cc1為C語(yǔ)言真正編譯器)結(jié)果: 生成匯編文件test.s, test.s中包含了AT&T的x86匯編代碼。作用: 通過(guò)詞法和語(yǔ)法分析,確認(rèn)所有指令符合語(yǔ)法規(guī)則(否則報(bào)編譯錯(cuò)),之后翻譯成對(duì)應(yīng)的中間碼,在linux中被稱為RTL(Register Transfer Language),通常是平臺(tái)無(wú)關(guān)的,這個(gè)過(guò)程也被稱為編譯前端。編譯后端對(duì)RTL樹(shù)進(jìn)行裁減,優(yōu)化,得到在目標(biāo)機(jī)上可執(zhí)
18、行的匯編代碼。gcc采用as作為其匯編器,所以匯編碼是AT&T格式的,而不是Intel格式,所以在用gcc編譯嵌入式匯編時(shí),也要采用AT&T格式。3.3 編譯及優(yōu)化編譯命令: 3.4 匯編匯編命令: $ gcc -o test.o -c test.s $ as -o test.o test.s執(zhí)行結(jié)果: 生成目標(biāo)機(jī)器指令文件test.o(可以通過(guò)objdump查看匯編指令)原理: 把匯編語(yǔ)言代碼翻譯成目標(biāo)機(jī)器指令, 用file test.o 可以看到test.o是一個(gè)relocatable的ELF文件,通常包含.text .rodata代碼段和數(shù)據(jù)段??捎胷eadelf -r test.o查看
19、需要relocation的部分。3.4 匯編匯編命令:3.5 鏈接執(zhí)行命令: $ gcc -o test test.o執(zhí)行結(jié)果: 生成可執(zhí)行文件test (可用objdump查看) 原理: 將在一個(gè)文件中引用的符號(hào)同在另外一個(gè)文件中該符號(hào)的定義鏈接起來(lái),使得所有的這些目標(biāo)文件鏈接成為一個(gè)能被操作系統(tǒng)加載到內(nèi)存的執(zhí)行體。(如果有不到的符號(hào)定義,或者重復(fù)定義等,會(huì)報(bào)鏈接錯(cuò))。用file test 可以看到test是一個(gè)executable的ELF文件。 3.5 鏈接執(zhí)行命令: 3.6 執(zhí)行執(zhí)行過(guò)程 $ ./test3.6 執(zhí)行執(zhí)行過(guò)程GCC常用編譯選項(xiàng)GCC常用編譯選項(xiàng)預(yù)編譯選項(xiàng)-DMACRO定義
20、“MACRO” 宏為字符串“1”-DMACRO=DEF定義“MACRO” 宏為字符串“DEF”-UMACRO取消對(duì)“MACRO” 宏的定義-E只運(yùn)行C 預(yù)編譯器cpp預(yù)編譯選項(xiàng)-DMACRO定義“MACRO” 宏為字符串“1編譯選項(xiàng)-c只編譯并生成object文件-S只預(yù)處理和編譯,把文件編譯成為匯編代碼greet.s-g生成可被gdb使用的標(biāo)準(zhǔn)調(diào)試信息-ggdb生成只被gdb使用的擴(kuò)展調(diào)試信息-mXXX針對(duì)“XXX”CPU進(jìn)行優(yōu)化,如“XXX”可以是486、586等-o FILE生成指定的輸出文件名“FILE”-O0不進(jìn)行代碼優(yōu)化-O 或 -O1進(jìn)行一般的代碼優(yōu)化,減少執(zhí)行代碼大小和執(zhí)行的時(shí)
21、間-O2比 -O1進(jìn)行更多的代碼優(yōu)化,一般在內(nèi)核編譯中會(huì)使用-O3比 -O2 更進(jìn)一步優(yōu)化-w不生成任何警告信息-Wall生成所有級(jí)別的警告信息-Werror把所有的警告當(dāng)成錯(cuò)誤,并中止編譯過(guò)程編譯選項(xiàng)-c只編譯并生成object文件搜索目錄(頭文件和庫(kù)文件)-IDIRECTORY除缺省情況外,指定其它頭文件搜索路徑“DIRECTORY”-LDIRECTORY除缺省情況外,指定其它函數(shù)庫(kù)搜索路徑“DIRECTORY”-lLIBRARY確定鏈接時(shí)需要的其它函數(shù)庫(kù)“LIBRARY”搜索目錄(頭文件和庫(kù)文件)-IDIRECTORY除缺省情況-shared生成支持動(dòng)態(tài)共享庫(kù)的執(zhí)行文件-static不支
22、持動(dòng)態(tài)共享庫(kù),把函數(shù)庫(kù)中內(nèi)容靜態(tài)鏈接到執(zhí)行文件中-MM輸出源文件的依賴關(guān)系-fPIC產(chǎn)生位置無(wú)關(guān)代碼(英文縮寫(xiě)為PIC),一般創(chuàng)建共享庫(kù)時(shí)需要-shared生成支持動(dòng)態(tài)共享庫(kù)的執(zhí)行文件C語(yǔ)言gcc強(qiáng)化訓(xùn)練2課件靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)創(chuàng)建函數(shù)庫(kù)分類(lèi):靜態(tài)庫(kù): 在編譯過(guò)程中將庫(kù)函數(shù)代碼直接加入到生成的可執(zhí)行程序中,程序運(yùn)行過(guò)程中不需要利用庫(kù)函數(shù)。共享庫(kù): 編譯時(shí),只是在生成的可執(zhí)行程序中簡(jiǎn)單指定需要使用的庫(kù)函數(shù)信息,程序運(yùn)行過(guò)程中需要利用庫(kù)函數(shù)。動(dòng)態(tài)庫(kù): 共享庫(kù)的一種變化形式,目前大都采用共享庫(kù)的方式。命名:靜態(tài)庫(kù): 前綴lib+庫(kù)名+.a (libm.a, libstdc+.a等)共享庫(kù): 前綴lib+
23、庫(kù)名+.so+版本號(hào) (libm.so.6, libc.so.6)靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)創(chuàng)建函數(shù)庫(kù)創(chuàng)建靜態(tài)庫(kù)靜態(tài)函數(shù)庫(kù)是一組目標(biāo)文件(*.o)的集合創(chuàng)建步驟:gcc -c test1.c test2.c (生成test1.o, test2.o)ar -cr libtest.a test1.o test2.o (生成函數(shù)庫(kù)libtest.a)ar函數(shù)說(shuō)明:用途:創(chuàng)建和修改庫(kù)函數(shù),或從庫(kù)函數(shù)提取目標(biāo)文件舉例:ar -rs lib-name list-of-files (將列表中的目標(biāo)文件加入到庫(kù)中,并產(chǎn)生索引文件)ar -ds lib-name list-of-files (將列表中列出的目標(biāo)文件從庫(kù)中刪
24、除,并產(chǎn)生索引文件)ar -x lib-name list-of-files (不修改庫(kù)文件,從庫(kù)中提取列表中列出的目標(biāo)文件)創(chuàng)建靜態(tài)庫(kù)靜態(tài)函數(shù)庫(kù)是一組目標(biāo)文件(*.o)的集合創(chuàng)建靜態(tài)庫(kù)示例源碼創(chuàng)建靜態(tài)庫(kù)的方法:arcaculation.c#include int main(void) int x = 5 ; int y = 3 ; printf (x + y = %3dn, add(x, y) ); printf (x - y = %3dn, minus(x, y) ); printf (x * y = %3dn, multiply(x, y) ); printf (x % y = %3dn
25、, mod(x, y) ); return 1;add_minus.cint add(int x, int y) int result; result = x + y; return result;int minus(int x, int y) int result; result = x - y; return result;multiply_mod.cint multiply(int x, int y) int result; result = x * y; return result;int mod(int x, int y) int result; result = x % y; re
26、turn result;創(chuàng)建靜態(tài)庫(kù)示例源碼創(chuàng)建靜態(tài)庫(kù)的方法:arcaculati創(chuàng)建靜態(tài)庫(kù)示例操作命令創(chuàng)建靜態(tài)庫(kù)示例操作命令一個(gè)容易忽略的順序問(wèn)題 靜態(tài)庫(kù)不能先于原程序鏈接,這是因?yàn)殚_(kāi)始時(shí)還沒(méi)有任何 未定義的符號(hào),庫(kù)中的內(nèi)容不會(huì)被鏈入,所以應(yīng)該注意將靜 態(tài)庫(kù)的使用(-l選項(xiàng))都寫(xiě)在最后。一個(gè)容易忽略的順序問(wèn)題 靜態(tài)庫(kù)不能先于原程序鏈接,創(chuàng)建、使用共享庫(kù)示例 vicknec$ gcc -fPIC -c add_minus.c vicknec$ gcc -fpic -c multiply_mod.c vicknec$ gcc -shared -fpic -o libalg.so add_minus
27、.o multiply_mod.o vicknec$ gcc -o cacul -lalg caculation.c /usr/bin/ld: cannot find -lalg collect2: ld returned 1 exit status vicknec$ gcc -o cacul -L. -lalg caculation.c vicknec$ ./cacul ./cacul: error while loading shared libraries: libalg.so: cannot open shared object file: No such file or direct
28、ory創(chuàng)建、使用共享庫(kù)示例 vicknec$ gcc 創(chuàng)建共享庫(kù)步驟創(chuàng)建共享庫(kù) gcc -c -fPIC test1.cgcc -c -fPIC test2.cgcc -shared -fPIC -o libtest.so test1.o test2.o編譯使用了共享庫(kù)的程序gcc -o main Ldir -ltest main.c創(chuàng)建共享庫(kù)步驟創(chuàng)建共享庫(kù)共享庫(kù)系統(tǒng)自動(dòng)動(dòng)態(tài)加載問(wèn)題1.拷貝動(dòng)態(tài)庫(kù)文件到/lib或/usr/lib去 $ cp libalg.so /usr/lib or $cp libalg.so /lib2.改變環(huán)境變量LD_LIBRARY_PATH$ LD_LIBRARY_P
29、ATH=$PWD $ export LD_LIBRARY_PATH共享庫(kù)系統(tǒng)自動(dòng)動(dòng)態(tài)加載問(wèn)題1.拷貝動(dòng)態(tài)庫(kù)文件到/lib或/u應(yīng)用程序自身完成動(dòng)態(tài)加載 可以在自己的程序中使用 dlopen()。該函數(shù)將打 開(kāi)一個(gè)新庫(kù),并把它裝入內(nèi)存。 dlopen() 在 dlfcn.h 中定義,并在 dl 庫(kù)中實(shí)現(xiàn)。應(yīng)用程序自身完成動(dòng)態(tài)加載 可以在自己的程序檢查庫(kù)依賴關(guān)系函數(shù)庫(kù)之間的相互引用ldd的使用:用于查看庫(kù)函數(shù)之間的依賴性vicknec gcc-lab$ cd /usr/libvicknec lib$ ldd libtiff.so libjpeg.so.62 = /usr/lib/libjpeg.s
30、o.62 (0 x4004c000) libz.so.1 = /usr/lib/libz.so.1 (0 x4006b000) libc.so.6 = /lib/i686/libc.so.6 (0 x40079000) /lib/ld-linux.so.2 = /lib/ld-linux.so.2 (0 x80000000)檢查庫(kù)依賴關(guān)系函數(shù)庫(kù)之間的相互引用應(yīng)用程序自身完成動(dòng)態(tài)加載示例#include #include int main(void) int x = 5 ; int y = 3 ; void * handle; int ( *dl_add )( int, int ); int (
31、 *dl_mod )( int, int ); handle = dlopen( /usr/lib/libalg.so, RTLD_LAZY ); dl_add = dlsym( handle, add ); dl_mod = dlsym( handle, mod ); printf (x + y = %3dn, dl_add( x, y ) ); printf (x % y = %3dn, dl_mod( x, y ) ); dlclose( handle ); return 1;應(yīng)用程序自身完成動(dòng)態(tài)加載示例#include /lib/i686/libc.so.6 (0 x4002c000)
32、 /lib/ld-linux.so.2 =/lib/ld-linux.so.2 (0 x40000000) rootboota# ldd Utility The ldd utility C語(yǔ)言gcc強(qiáng)化訓(xùn)練2課件make和Makefile的關(guān)系make和Makefile的關(guān)系就像演員和劇本的關(guān)系make是系統(tǒng)的一個(gè)程序(/usr/bin/make)Makefile是規(guī)則的文件make就是去解析Makefile的文件來(lái)執(zhí)行相關(guān)的命令Makefile有三種命名形式: Makefile, makefile, GNUMakefilemake和Makefile的關(guān)系make和Makefile的3.7 一
33、個(gè)簡(jiǎn)單的Makefile格式all: hello echo “Begin to build hello“hello: echo “Display hello”clean: xxxxrm -rf *.o hello注意符號(hào)的用途, 表示后面的命令不要顯示出來(lái)第一個(gè)target第二個(gè)target第三個(gè)target紅色的xxxx表示鍵盤(pán)上的Tab鍵,而不是空白,任何命令必須以Tab鍵開(kāi)始。3.7 一個(gè)簡(jiǎn)單的Makefile格式all: hello注make (在上述Makefile中,make和make all 操作一樣,因?yàn)閍ll是第一個(gè)target)make allmake hellomake
34、cleanmake (在上述Makefile中,make和make3.7 一個(gè)簡(jiǎn)單的Makefile格式myname = Saifall: hello echo “myname is: $(myname)” echo “Begin to build hello“hello: echo “Display hello”clean: rm -rf *.o hello變量myname使用$( )表示3.7 一個(gè)簡(jiǎn)單的Makefile格式myname = Sa一個(gè)簡(jiǎn)單的C程序(hello.c和foo1.c)#include /* hello.c */extern int foo1(void);int m
35、ain(void) foo1();#include /* foo1.c */int foo1(void) printf(“print foo1n”);一個(gè)簡(jiǎn)單的C程序(hello.c和foo1.c)#inclu3.7 通常的Makefile格式all: hello echo Finish to build hello“hello : hello.o foo1.o gcc -o hello hello.o foo1.ohello.o : hello.c gcc -c -o hello hello.cfoo1.o : foo1.c gcc -c -o foo1.o foo1.cclean: rm -rf *.o hello3.7 通常的Makefile格式all: hello使用shell腳本來(lái)表示腳本1 build.sh#! /bin/sh gcc -c -o hello hello.c gcc -c -o foo1.o foo1.c gcc -o hello he
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- T-ZSM 0060-2024“領(lǐng)跑者”評(píng)價(jià)技術(shù)要求 微型往復(fù)活塞空氣壓縮機(jī)
- 二零二五年度競(jìng)業(yè)禁止期限及競(jìng)業(yè)限制解除后的競(jìng)業(yè)禁止責(zé)任及賠償執(zhí)行及監(jiān)督合同
- 二零二五年度金融衍生品合同印花稅稅率變動(dòng)與市場(chǎng)創(chuàng)新
- 二零二五年度手房過(guò)戶二手房交易中介服務(wù)合同協(xié)議
- 二零二五年度智慧能源合伙經(jīng)營(yíng)股權(quán)協(xié)議書(shū)
- 二零二五年度文藝演出宣傳推廣合作協(xié)議
- 2025年度智能債權(quán)轉(zhuǎn)讓服務(wù)合同不可適用借款合同解析
- 2025年度生態(tài)魚(yú)塘資源租賃管理合同
- 二零二五年度商鋪?zhàn)赓U糾紛解決機(jī)制合同
- 二零二五年度跨區(qū)域集體合同-XX行業(yè)職工勞動(dòng)條件提升協(xié)議
- 近三年投標(biāo)沒(méi)有發(fā)生過(guò)重大質(zhì)量安全事故的書(shū)面聲明范文
- 《工程熱力學(xué)》(第四版)全冊(cè)配套完整課件
- 2024時(shí)事政治考試題庫(kù)(100題)
- 2024年司法考試真題及答案
- 膽總管切開(kāi)取石T管引流術(shù)護(hù)理查房參考課件
- YYT 1814-2022 外科植入物 合成不可吸收補(bǔ)片 疝修補(bǔ)補(bǔ)片
- 工程機(jī)械設(shè)備綜合保險(xiǎn)
- 中圖版高中地理選擇性必修1第3章第1節(jié)常見(jiàn)天氣現(xiàn)象及成因課件
- 2024年時(shí)政必考試題庫(kù)(名師系列)
- 獸醫(yī)檢驗(yàn)題庫(kù)與答案
- 第三章 環(huán)境污染物在體內(nèi)的生物轉(zhuǎn)運(yùn)和生物轉(zhuǎn)化課件
評(píng)論
0/150
提交評(píng)論