程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> gcc 筆記

gcc 筆記

編輯:C++入門知識

http://www.network-theory.co.uk/docs/gccintro/ 看了這個手冊,了解了一些gcc的相關知識,記錄一下。 1. gcc -Wall hello.c    
gcc -Wall -g hello.c // 加入了調試信息,可以用gdb調試。 2. gcc 默認搜索的header file path is: /usr/local/include /usr/include 默認搜索的lib path is /usr/local/lib /usr/lib 而且,在/usr/local/xxx中的文件,優先級要高於/usr/xxx 可以使用 `gcc -print-prog-name=cc1` -v
`gcc -print-prog-name=cc1plus` -v
  如果你的header file 和 lib 不在這幾個地方。那就要用 -I -L來指定。 -I 表示要找的header file 文件夾 -L 表示要找的lib file 文件夾 例: gcc -Wall -I/opt/gdbm-1.8.3/include -L/opt/gdbm-1.8.3/lib dbmain.c -lgdbm
    $ export C_INCLUDE_PATH

$ LIBRARY_PATH=/opt/gdbm-1.8.3/lib
$ export LIBRARY_PATH
  這些path的搜索順序是:先搜索用-I -L指定的,然後就是export進來的,最後才是/usr/local/xxx,最後是/usr/xxx   4. 可以使用':'來區分include 或者 lib,這樣就不用一次次指定。ex: $ C_INCLUDE_PATH=.:/opt/gdbm-1.8.3/include:/net/include $ LIBRARY_PATH=.:/opt/gdbm-1.8.3/lib:/net/lib For C++ programs, use the environment variable CPLUS_INCLUDE_PATH instead of C_INCLUDE_PATH. .表示當前目錄 如果要分開寫,就會很麻煩,上面的就要表示為: $ gcc -I. -I/opt/gdbm-1.8.3/include -I/net/include    -L. -L/opt/gdbm-1.8.3/lib -L/net/lib .....   5. 要加載某個動態庫如libName.so,那要在編譯時加入 -lName, gcc會自動在設定好的lib path找libName.so的文件,.so文件的優先級高於.a的靜態庫文件,如果要加靜態庫,那就要加入 -static, 如: $ gcc -Wall -static -I/opt/gdbm-1.8.3/include/ 
    -L/opt/gdbm-1.8.3/lib/ dbmain.c -lgdbm
  6. /etc/ld.so.conf 這個文件管理著加載so文件的路徑   7. 對於調試,有時程序會出現core dumped,這時,你是多麼的希望有一個core文件。首先要先在編譯時加入-g選項。 然後查看 $ulimit -c 0 $ulimit -c unlimited $ulimit -c unlimited 如果ulimit -c得到的是0,說明沒有開啟在core dumped時生成core文件。使用ulimit -c unlimited就可以解決。 然後: $gdb a.out core   8. how the compiler works (1)preprocessing(to expand macros) (2)compilation(from source code to assembly language) (3)assembly(from assembly language to machine code) (4)linking(to create the final executable)   9. 當你知道的所有lib在命令行裡了,然後還報 $ gcc -Wall test.c -lm -o calc 如果把 -lm 放到test.c前面,就會報了。因為在test.c裡找不到sqrt()定義是,就會向後找。如果-lm放在前面,test.c自然就找不到了。   10. 可以通過 cpp -dM /dev/null 查看所有在預編譯器中定義的宏。   11. 還是對於調試,有時會定義 #ifdef TEST
xxx
#endif
如果你想讓這中間的代碼執行,那就要 gcc -DTEST test.c -o test 就是加入-DXXX,XXX為定義的標簽。   12. 可以使用gprof進行性能測試。   13. 執行文件的情況分析。讓你知道 $file a.out 出來的信息表示什麼。 http://www.network-theory.co.uk/docs/gccintro/gccintro_89.html   14. $ldd a.out 得到可執行文件所引用的動態庫。
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved