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
這些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, 如: $ export C_INCLUDE_PATH
$ LIBRARY_PATH=/opt/gdbm-1.8.3/lib
$ export LIBRARY_PATH $ gcc -Wall -static -I/opt/gdbm-1.8.3/include/
6. /etc/ld.so.conf 這個文件管理著加載so文件的路徑 7. 對於調試,有時程序會出現core dumped,這時,你是多麼的希望有一個core文件。首先要先在編譯時加入-g選項。 然後查看
-L/opt/gdbm-1.8.3/lib/ dbmain.c -lgdbm $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 得到可執行文件所引用的動態庫。