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