指令編譯
㈠ gcc的常用編譯命令
gcc編譯命令總結:
1.無選項
gcc test.c
默認生成可執行文件a.out
2.-o 生成的可執行文件名
gcc test.c -o test
3.多個文件一起編譯
gcc test1.c test2.c -o test
4.-O選項
gcc -O1 test1.c -o test
作用:使用編譯優化級別1編譯程序,優化級別為1-3,級別越大優化效果越好,但編譯時間越長
5 -g選項 :生成可調試信息
6.鏈接庫的命令
gcc test.c -lm -o test
-lm 表示鏈接系統的數學庫 libm.a
㈡ 怎麼用命令行編譯,打包,運行java
一、編譯:從.java生成.class
(1)eclipse編譯:
在菜單欄里選擇"項目"→"構建"/"自動構建",就會在workspace的項目里的bin目錄下自動生成.class文件,不需要手動一個個去編譯。
(2)命令行編譯:
進入src目錄,直接javac com/csdn/javacode/A.java,注意這里一定要寫全路徑com/csdn/javacode(這里一定是/號而非.號),並且.java文件一定要有後綴名!
這樣生成的.class文件和src在同一目錄下,就是在哪個目錄下手動一個個編譯,生成的.class文件就在哪個目錄下。
---------------------------------------------
二、運行:從.class生成.exe
命令行運行:
cd進入bin目錄(eclipse構建生成的一般都在bin目錄下),直接java com.csdn.javacode.EncryptClasses key.data
(運行EncryptClasses.class,輸出到key.data文件里)
-----注意.class文件在命令行里不要帶後綴名!並且路徑要寫全,執行時,包名加路徑時,一定是點號.而非/號!!!
------------------------------------------------------------
三、打包jar:
把零散的.class文件打包為jar:(不是在eclipse里"導出"為jar包)
cd進入要打成jar包的class文件所在目錄:jar cvf [生成jar的名稱.jar] [列出class文件] //若有多個用空格隔開
例1:操作零散的單個或幾個class文件:
cd bin
jar cvf ipaddress.jar com/cn/lbs/IPSeeker.class com/cn/lbs/SplitAddress.class
之後會在bin目錄下生成ipaddress.jar,不過這里jar下面沒有com.csdn.ipaddress包,因為之前沒有創建目錄
例2:把一個文件夾下面所有的class文件打成jar包
(這里讓生成的jar目錄下有com.csdn.ipaddress包,於是在總的文件夾ipaddress下新建文件夾嵌套com\csdn\ipaddress\,裡面放上需要打包的.class文件)
cd回到總的文件夾ipaddress,
jar cvf ipaddress.jar * 回車
㈢ 預編譯的編譯指令
預編譯指令指示了在程序正式編譯前就由編譯器進行的操作,可以放在程序中的任何位置。常見的預編譯指令有:
(1)#include 指令
該指令指示編譯器將xxx.xxx文件的全部內容插入此處。若用<>括起文件則在系統的INCLUDE目錄中尋找文件,若用 括起文件則在當前目錄中尋找文件。一般來說,該文件是後綴名為h或cpp的頭文件。
注意:<>不會在當前目錄下搜索頭文件,如果我們不用<>而用把頭文件名擴起,其意義為在先在當前目錄下搜索頭文件,再在系統默認目錄下搜索。
(2)#define指令
該指令有三種用法:
第一種是定義標識,標識有效范圍為整個程序,形如#define XXX,常與#if配合使用;
第二種是定義常數,如#define max 100,則max代表100(這種情況下使用const定義常數更好,原因見注1);
第三種是定義函數,如#define get_max(a, b) ((a)>(b)?(a):(b)) 則以後使用get_max(x,y)就可以得到x和y中較大的數(這種方法存在一些弊病,見注2)。
第四種是定義宏函數,如#define GEN_FUN(type) type max_##type(type a,type b){return a>b?a:b;} ,使用時,用GEN_FUN(int),則此處預編譯後就變成了 max_int(int a,int b){return a>b?a:b;},以後就可以使用max_int(x,y)就可以得到x和y中較大的數.比第三種,增加了類型的說明。
(3)#if、#else和#endif指令
這些指令一般這樣配合使用:
#if defined(標識) //如果定義了標識
要執行的指令
#else
要執行的指令
#endif
在頭文件中為了避免重復調用(比如說兩個頭文件互相包含對方),常採用這樣的結構:
#if !(defined XXX) //XXX為一個在你的程序中唯一的標識符,
//每個頭文件的標識符都不應相同。
//起標識符的常見方法是若頭文件名為abc.h
//則標識為abc_h
#define XXX
真正的內容,如函數聲明之類
#endif
注1:因為:const常量有數據類型,而宏常量沒有數據類型。編譯器可以對前者進行類型安全檢查,而對後者只進行字元替換,沒有類型安全檢查,並且在字元替換時可能會產生意料不到的錯誤(邊際效應)。
注2:例如get_max(a++, b)時,a++會被執行多少次取決於a和b的大小!所以建議還是用內聯函數而不是這種方法提高速度。雖然有這樣的弊病,但這種方法的確非常靈活,因為a和b可以是各種數據類型。
注3:可以查看網路的預處理命令,編排的比較簡明。
㈣ 條件編譯的指令
條件編譯指令將決定哪些代碼被編譯,而哪些是不被編譯的。可以根據表達式的值或者某個特定的宏是否被定義來確定編譯條件。 一般形式有如下幾種
(1) #if表達式//語句段1#else//語句段2]#endif如果表達式為真,就編譯語句段1,否則編譯語句段2
(2) #if表達式1//語句段1#elif表達式2//語句段2#else//語句段3#endif如果表達式1真,則編譯語句段1,否則判斷表達式2;如果表達式2為真,則編譯語句段2,否則編譯語句段3 (1)#ifdef的一般形式: #ifdef宏名//語句段#endif作用:如果在此之前已定義了這樣的宏名,則編譯語句段。
(2)#ifndef的一般形式: #ifndef宏名//語句段#endif作用:如果在此之前沒有定義這樣的宏名,則編譯語句段。
#else可以用於#ifdef和#ifndef中,但#elif不可以。 #include<stdio.h>#defineLETTER1intmain(intargc,char*argv[]){charstr[20]=CLanguage,c;inti;i=0;while((c=str[i])!='