日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
Android編譯系統(tǒng)中頭文件搜索路徑的順序問(wèn)題

今天在編譯一個(gè)代碼時(shí)發(fā)現(xiàn)Android編譯系統(tǒng)在設(shè)置頭文件搜索路徑的順序上好像有些問(wèn)題。Android編譯系統(tǒng)本身設(shè)置了一堆公共的頭文件搜索路徑(參見(jiàn)pathmap.mk中pathmap_INCL的定義),然后允許每個(gè)項(xiàng)目在自己的Android.mk中通過(guò)LOCAL_C_INCLUSES 來(lái)添加獨(dú)特的搜索路徑。按照一般的想法,在最后的編譯參數(shù)中,項(xiàng)目自己獨(dú)特的搜索路徑應(yīng)該放在公共搜索路徑之前,這樣,一旦出現(xiàn)頭文件名沖突的情況,會(huì)優(yōu) 先使用項(xiàng)目自己指定的頭文件。但是在Android的編譯系統(tǒng)中情況并非如此,項(xiàng)目自定義的頭文件搜索路徑反而被放在了最后。參見(jiàn) definitions.mk文件里的下面這個(gè)定義:

成都創(chuàng)新互聯(lián)長(zhǎng)期為近千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為四平企業(yè)提供專(zhuān)業(yè)的成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、外貿(mào)網(wǎng)站建設(shè)四平網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。

 
 
  1. define transform-cpp-to-o 
  2. @mkdir -p $(dir $@) 
  3. @echo "target $(PRIVATE_ARM_MODE) C++: $(PRIVATE_MODULE) <= $<" 
  4. $(hide) $(PRIVATE_CXX) \ 
  5.     $(foreach incdir, \ 
  6.         $(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \ 
  7.         $(TARGET_PROJECT_INCLUDES) \ 
  8.         $(TARGET_C_INCLUDES) \ 
  9.          ) \ 
  10.         $(PRIVATE_C_INCLUDES) \ 
  11.       , \ 
  12.         -I $(incdir) \ 
  13.      ) \ 
  14.     -c \ 
  15.     $(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \ 
  16.         $(TARGET_GLOBAL_CFLAGS) \ 
  17.         $(TARGET_GLOBAL_CPPFLAGS) \ 
  18.         $(PRIVATE_ARM_CFLAGS) \ 
  19.      ) \ 
  20.     -fno-rtti \ 
  21.     $(PRIVATE_CFLAGS) \ 
  22.     $(PRIVATE_CPPFLAGS) \ 
  23.     $(PRIVATE_DEBUG_CFLAGS) \ 
  24.     -MD -o $@ $< 
  25. $(hide) $(transform-d-to-p) 
  26. endef 

這個(gè)定義就是編譯C++文件使用的命令行。注意紅字部分,PRIVATE_C_INCLUDES中包含了項(xiàng)目的LOCAL_C_INCLUDES的定義 (參見(jiàn)binary.mk)。明顯項(xiàng)目自定義的搜索路徑被放在了最后。后面還有C文件的編譯命令行的定義(define transform-c-or-s-to-o-no-deps)也同樣如此。

不知道Android這樣設(shè)計(jì)是出于什么考慮。我嘗試把順序調(diào)整一下,看是否會(huì)影響Android的編譯。上述定義調(diào)整之后如下:

 
 
  1. define transform-cpp-to-o 
  2. @mkdir -p $(dir $@) 
  3. @echo "target $(PRIVATE_ARM_MODE) C++: $(PRIVATE_MODULE) <= $<" 
  4. $(hide) $(PRIVATE_CXX) \ 
  5.     $(foreach incdir, \ 
  6.         $(PRIVATE_C_INCLUDES) \  
  7. $(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \ 
  8.         $(TARGET_PROJECT_INCLUDES) \ 
  9.         $(TARGET_C_INCLUDES) \ 
  10.          ) \ 
  11.       , \ 
  12.         -I $(incdir) \ 
  13.      ) \ 
  14.     -c \ 
  15.     $(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \ 
  16.         $(TARGET_GLOBAL_CFLAGS) \ 
  17.         $(TARGET_GLOBAL_CPPFLAGS) \ 
  18.         $(PRIVATE_ARM_CFLAGS) \ 
  19.      ) \ 
  20.     -fno-rtti \ 
  21.     $(PRIVATE_CFLAGS) \ 
  22.     $(PRIVATE_CPPFLAGS) \ 
  23.     $(PRIVATE_DEBUG_CFLAGS) \ 
  24.     -MD -o $@ $< 
  25. $(hide) $(transform-d-to-p) 
  26. endef  

對(duì)define transform-c-or-s-to-o-no-deps也做類(lèi)似調(diào)整。重新編譯后發(fā)現(xiàn)只有webkit的編譯有問(wèn)題。原因在于webkit的代碼中 包含了幾個(gè)STL的頭文件(WebKit/android/stl),特別是其中的strings與bionic定義的頭文件沖突,在調(diào)整頭文件搜索順序 后,優(yōu)先選擇了這個(gè)文件。這個(gè)strings文件其實(shí)是一個(gè)空文件(除了注釋沒(méi)有任何語(yǔ)句),干脆刪除了它,果然編譯順利進(jìn)行了,一直到編譯完成再也沒(méi)有 出現(xiàn)問(wèn)題??磥?lái)上述調(diào)整時(shí)可行的。我用的android源代碼版本是2.0,其它版本沒(méi)有試過(guò)不知道怎么樣。BTW,如果想在編譯時(shí)打印出編譯命令,在make的參數(shù)中加上SHOW_COMMANDS=1即可。


標(biāo)題名稱(chēng):Android編譯系統(tǒng)中頭文件搜索路徑的順序問(wèn)題
文章網(wǎng)址:http://www.5511xx.com/article/cdjopgg.html