偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Android編譯系統(tǒng)中頭文件搜索路徑的順序問題

移動開發(fā) Android
Android編譯系統(tǒng)本身設(shè)置了一堆公共的頭文件搜索路徑,然后允許每個項目在自己的Android.mk中通過LOCAL_C_INCLUSES 來添加獨特的搜索路徑。

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

  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 

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

不知道Android這樣設(shè)計是出于什么考慮。我嘗試把順序調(diào)整一下,看是否會影響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  

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

責(zé)任編輯:閆佳明 來源: oschina
相關(guān)推薦

2009-10-23 15:53:00

linux庫文件

2025-05-14 08:00:00

Android應(yīng)用簽名編譯系統(tǒng)

2011-07-14 22:36:37

C++

2024-05-11 14:26:39

Java系統(tǒng)文件

2010-01-25 17:55:38

C++頭文件

2009-06-17 17:00:03

2013-06-28 14:00:28

Android

2021-06-08 08:52:18

Makefile編譯c 文件

2016-09-19 10:54:36

C語言靜態(tài)連接語言

2023-10-06 23:56:42

順序查找Python

2013-05-21 10:10:29

Hadoop文件系統(tǒng)

2013-05-24 09:57:28

搜索流程搜索產(chǎn)品設(shè)計搜索設(shè)計

2010-02-06 14:48:37

C++頭文件

2011-07-06 11:20:09

WPS行政公文

2009-07-10 17:16:39

MyEclipse不編

2011-09-14 15:23:00

Android 2.2

2023-06-24 10:44:34

Linux文件搜索

2024-12-24 12:00:00

inlinC++17頭文件

2009-02-26 16:28:43

靜態(tài)編譯動態(tài)編譯Java

2010-02-02 13:04:03

C++頭文件
點贊
收藏

51CTO技術(shù)棧公眾號