gcc编译c文件 python.h 未找到
windows 下默認路徑找不到python.h
gcc -c -I d:/ProLang/python379/include parser.c -o parser.so
加上文件路徑就可以了。
GCC 編譯器在編譯一個C語言程序時需要經(jīng)過以下 4 步:
將C語言源程序預處理,生成.i文件。
預處理后的.i文件編譯成為匯編語言,生成.s文件。
將匯編語言文件經(jīng)過匯編,生成目標文件.o文件。
將各個模塊的.o文件鏈接起來生成一個可執(zhí)行程序文件。
常用編譯命令選項
用法:#gcc test.c
作用:將test.c預處理、匯編、編譯并鏈接形成可執(zhí)行文件。
這里未指定輸出文件,默認輸出為a.out。
用法:#gcc test.c -o test
作用:將test.c預處理、匯編、編譯并鏈接形成可執(zhí)行文件test。
-o選項用來指定輸出文件的文件名。
用法:#gcc -E test.c -o test.i
作用:將test.c預處理輸出test.i文件。
用法:#gcc -S test.i
作用:將預處理輸出文件test.i匯編成test.s文件。
用法:#gcc -c test.s
作用:將匯編輸出文件test.s編譯輸出test.o文件。
用法:#gcc test.o -o test
作用:將編譯輸出文件test.o鏈接成最終可執(zhí)行文件test。
用法:#gcc -O1 test.c -o test
作用:使用編譯優(yōu)化級別1編譯程序。級別為1~3,級別越大優(yōu)化效果越好,但編譯時間越長。
用法:指定 include 包含文件的搜索目錄
9 選項-g 生成調(diào)試信息,該程序可以被調(diào)試器調(diào)試
多源文件的編譯方法
如果有多個源文件,基本上有兩種編譯方法:
[假設有兩個源文件為test.c和testfun.c]
用法:#gcc testfun.c test.c -o test
作用:將testfun.c和test.c分別編譯后鏈接成test可執(zhí)行文件。
用法:
#gcc -c testfun.c //將testfun.c編譯成testfun.o
#gcc -c test.c //將test.c編譯成test.o
#gcc -o testfun.o test.o -o test //將testfun.o和test.o鏈接成test
以上兩種方法相比較,第一中方法編譯時需要所有文件重新編譯,而第二種方法可以只重新編譯修改的文件,未修改的文件不用重新編譯。
開發(fā)軟件時,完全不使用第三方函數(shù)庫的情況是比較少見的,通常來講都需要借助許多函數(shù)庫的支持才能夠完成相應的功能。從程序員的角度看,函數(shù)庫實際上就是一些頭文件(.h)和庫文件(so、或lib、dll)的集合。。雖然Linux下的大多數(shù)函數(shù)都默認將頭文件放到/usr/include/目錄下,而庫文件則放到/usr/lib/目錄下;Windows所使用的庫文件主要放在Visual Stido的目錄下的include和lib,以及系統(tǒng)文件夾下。但也有的時候,我們要用的庫不再這些目錄下,所以GCC在編譯時必須用自己的辦法來查找所需要的頭文件和庫文件。
例如我們的程序test.c是在linux上使用c連接mysql,這個時候我們需要去mysql官網(wǎng)下載MySQL Connectors的C庫,下載下來解壓之后,有一個include文件夾,里面包含mysql connectors的頭文件,還有一個lib文件夾,里面包含二進制so文件libmysqlclient.so
其中inclulde文件夾的路徑是/usr/dev/mysql/include,lib文件夾是/usr/dev/mysql/lib
3.1編譯成可執(zhí)行文件
首先我們要進行編譯test.c為目標文件,這個時候需要執(zhí)行
gcc –c –I /usr/dev/mysql/include test.c –o test.o
3.2鏈接
最后我們把所有目標文件鏈接成可執(zhí)行文件:
gcc –L /usr/dev/mysql/lib –lmysqlclient test.o –o test
Linux下的庫文件分為兩大類分別是動態(tài)鏈接庫(通常以.so結(jié)尾)和靜態(tài)鏈接庫(通常以.a結(jié)尾),二者的區(qū)別僅在于程序執(zhí)行時所需的代碼是在運行時動態(tài)加載的,還是在編譯時靜態(tài)加載的。
3.3強制鏈接時使用靜態(tài)鏈接庫
默認情況下, GCC在鏈接時優(yōu)先使用動態(tài)鏈接庫,只有當動態(tài)鏈接庫不存在時才考慮使用靜態(tài)鏈接庫,如果需要的話可以在編譯時加上-static選項,強制使用靜態(tài)鏈接庫。
在/usr/dev/mysql/lib目錄下有鏈接時所需要的庫文件libmysqlclient.so和libmysqlclient.a,為了讓GCC在鏈接時只用到靜態(tài)鏈接庫,可以使用下面的命令:
gcc –L /usr/dev/mysql/lib –static –lmysqlclient test.o –o test
靜態(tài)庫鏈接時搜索路徑順序:
ld會去找GCC命令中的參數(shù)-L
再找gcc的環(huán)境變量LIBRARY_PATH
再找內(nèi)定目錄 /lib /usr/lib /usr/local/lib 這是當初compile gcc時寫在程序內(nèi)的
動態(tài)鏈接時、執(zhí)行時搜索路徑順序:
編譯目標代碼時指定的動態(tài)庫搜索路徑
環(huán)境變量LD_LIBRARY_PATH指定的動態(tài)庫搜索路徑
配置文件/etc/ld.so.conf中指定的動態(tài)庫搜索路徑
默認的動態(tài)庫搜索路徑/lib
默認的動態(tài)庫搜索路徑/usr/lib
有關(guān)環(huán)境變量:
LIBRARY_PATH環(huán)境變量:指定程序靜態(tài)鏈接庫文件搜索路徑
LD_LIBRARY_PATH環(huán)境變量:指定程序動態(tài)鏈接庫文件搜索路徑
總結(jié)
以上是生活随笔為你收集整理的gcc编译c文件 python.h 未找到的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: input radio 样式
- 下一篇: python字符串数组切片性能_pyth