gcc:linux下的一個c編譯器。
常用gcc命令:
gcc -E main.c -o main.i //-E gcc預編譯指令,將c文件預編譯爲i文件 -o filename輸出爲名稱爲filename的文件
gcc -S main.i -o main.s //-S編譯指令,將i文件編譯爲s文件(彙編指令)
as main.s -o main.o //彙編爲目標文件(機器碼)
gcc main.o -o main //鏈接動態庫,轉爲可執行文件
以上是一步一步編譯成可執行文件的過程,
gcc -c main.c -o main 一步將c文件預編譯、編譯、彙編爲o文件的命令
如果有多個h文件和c文件要一起編譯,比如:main.c add.c add.h(add.h在當前目錄)
則命令爲:gcc main.c add.c -I. (.代表當前目錄)
動態庫與靜態庫的區別:
靜態庫在鏈接過程中將庫文件內容寫入可執行文件,生成可執行文件後刪除庫文件還是可以執行可執行文件的,而動態庫將庫文件函數地址寫入可執行文件,將庫文件刪除後,可執行文件也不能運行了,所以靜態庫容易配置,但佔的空間大,動態庫佔的空間小,工作中一般使用動態庫.
生成動態庫:
比如add.c中寫了一個add函數
1.gcc -fPIC -Wall -c add.c //-fPIC生成動態庫的選項(不是很明白)-Wall打開所有類型警告(開了是爲了讓動態庫更加標準,如果別人使用你的動態庫還報錯就很難看) -c直接預編譯編譯彙編到.o文件
2.gcc -shared -o libadd.so add.o //將add.o轉變爲動態庫libadd.so ,命名必須爲lib*.so,靜態庫必須爲lib*.a
然後將動態庫文件移到默認的尋找動態庫的文件夾中,比如/usr/lib
3.sudo mv libadd.so /usr/lib
在c程序中使用動態庫: gcc -omain main.c -ladd(-l動態庫名稱,即鏈接動態庫,libadd.c則爲-ladd)
製作靜態庫:
1. gcc -c -o add.o add.c 先一步生成目標文件.o文件
2. ar crsv libadd.a add.o //生成靜態庫文件lib*.a
3. sudo mv libadd.a /usr/lib
在c程序中使用靜態庫和動態庫一樣,所以如果有libadd.so和libadd.a使用哪個庫是不確定的。