下面是一個保存在文件 helloworld.cpp 中一個簡單的 C++ 程序的代碼:
/* helloworld.cpp */ #include <iostream> int main(int argc,char *argv[]) { std::cout << "hello, world" << std::endl; return(0); }
$ g++ helloworld.cpp
編譯器 g++ 通過檢查命令行中指定的文件的后綴名可識別其為 C++源代碼文件。編譯器默認的動作:編譯源代碼文件生成對象文件(object file),鏈接對象文件和 libstdc++ 庫中的函數得到可執行程序。然后刪除對象文件。由於命令行中未指定可執行程序的文件名,編譯器采用默認的 a.out。程序可以這樣來運行:
$ ./a.out
hello, world
更普遍的做法是通過 -o 選項指定可執行程序的文件名。下面的命令將產生名為 helloworld 的可執行文件:
$ g++ helloworld.cpp -o helloworld
在命令行中輸入程序名可使之運行:
$ ./helloworld
hello, world
gcc/g++ 在執行編譯時,需要4步
1.預處理,生成.i的文件[使用-E參數]
2.將預處理后的文件不轉換成匯編語言,生成文件.s[使用-S參數]
3.有匯編變為目標代碼(機器代碼)生成.o的文件[使用-c參數]
4.連接目標代碼,生成可執行程序[使用-o參數]
-Wall
顯示所有警告信息(warning all)
-g
只是編譯器,在編譯的時候,產生調試信息。
-O0
-O1
-O2
-O3
編譯器的優化選項的4個級別,-O0表示沒有優化,-O1為缺省值
-Idir
在你是用#i nclude"file"的時候,gcc/g++會先在當前目錄查找你所制定的頭文件,如
果沒有找到,他回到缺省的頭文件目錄找,如果使用-I制定了目錄,他
會先在你所制定的目錄查找,然后再按常規的順序去找。
-Ldir
制定編譯的時候,搜索庫的路徑。比如你自己的庫,能用他制定目錄,不然
編譯器將只在標准庫的目錄找。這個dir就是目錄的名稱。
-llibrary
制定編譯的時候使用的庫
例子用法
gcc -lcurses hello.c
使用ncurses庫編譯程式
-Wl,option
此選項傳遞option給連接程式;如果option中間有逗號,就將option分成多個選項,然
后傳遞給會連接程式。
gcc編譯鏈接動態庫時,很有可能編譯通過,但是執行時,找不到動態鏈接庫,那是
因為-L選項指定的路徑只在編譯時有效,編譯出來的可執行文件不知道-L選項后面的值,
當然找不到。可以用ldd <your_execute>看看是不有 ‘not found’在你鏈接的庫后面,
解決方法是通過-Wl,rpath=<your_lib_dir>,使得execute記住鏈接庫的位置。
-o
制定目標名稱,缺省的時候,gcc 編譯出來的文件是a.out
-rdynamic
選項 -rdynamic 用來通知鏈接器將所有符號添加到動態符號表中
(目的是能夠通過使用 dlopen 來實現向后跟蹤)
-fPIC
PIC就是position independent code
PIC使.so文件的代碼段變為真正意義上的共享。
詳見:http://blog.sina.com.cn/s/blog_54f82cc201011op1.html
-D
表示:#define
如:-DPOSGP730 等價於 #define POSGP730