當前位置:首頁 » 編程軟體 » 交叉編譯應用程序頭文件位置

交叉編譯應用程序頭文件位置

發布時間: 2023-07-26 21:28:09

① 怎麼查看Android編譯時候交叉編譯鏈工具位置

經常搞嵌入式開發的朋友對於交叉編譯環境應該並不陌生,說白了,就是一組運行在x86 PC機的編譯工具,可以讓你在PC機上編譯出目標平台(例如ARM)可識別的二進制文件。Android平台也提供了這樣的交叉編譯工具鏈,就放在Android的NDK開發包的toolchains目錄下,因此,我們的Makefile文件中,只需給出相應的編譯工具即可。
廢話就先說到這,直接上例子,我們目標是把下面這個math.c文件編譯成一個靜態庫文件:
#include <stdio.h>
int add( int a , int b ) {
return a+b;
}
你需要編寫一個Makefile文件,這里假設你的Android ndk被安裝在 /opt/android/ndk 目錄下,當然,你可以根據自己的實際情況修改Makefile中相關路徑的定義,Makefile文件示例如下:
# Makefile Written by ticktick
# Show how to cross-compile c/c++ code for android platform
.PHONY: clean
NDKROOT=/opt/android/ndk
PLATFORM=$(NDKROOT)/platforms/android-14/arch-arm
CROSS_COMPILE=$(NDKROOT)/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-
CC=$(CROSS_COMPILE)gcc
AR=$(CROSS_COMPILE)ar
LD=$(CROSS_COMPILE)ld
CFLAGS = -I$(PWD) -I$(PLATFORM)/usr/include -Wall -O2 -fPIC -DANDROID -DHAVE_PTHREAD -mfpu=neon -mfloat-abi=softfp
LDFLAGS =

② Linux下的交叉編譯環境設置

採用交叉編譯的主要原因在於,多數嵌入式目標系統不能提供足夠的資源供編譯過程使用,因而只好將編譯工程轉移到高性能的主機中進行。
linux下的交叉編譯環境重要包括以下幾個部分:
1.對目標系統的編譯器gcc
2.對目標系統的二進制工具binutils
3.目標系統的標准c庫glibc
4.目標系統的linux內核頭文件
交叉編譯環境的建立步驟
一、下載源代碼 下載包括binutils、gcc、glibc及linux內核的源代碼(需要注意的是,glibc和內核源代碼的版本必須與目標機上實際使用的版本保持一致),並設定shell變數PREFIX指定可執行程序的安裝路徑。
二、編譯binutils 首先運行configure文件,並使用--prefix=$PREFIX參數指定安裝路徑,使用--target=arm-linux參數指定目標機類型,然後執行make install。
三、配置linux內核頭文件
首先執行make mrproper進行清理工作,然後執行make config ARCH=arm(或make menuconfig/xconfig ARCH=arm)進行配置(注意,一定要在命令行中使用ARCH=arm指定cpu架構,因為預設架構為主機的cpu架構),這一步需要根據目標機的實際情況進行詳細的配置,筆者進行的實驗中目標機為HP的ipaq-hp3630 PDA,因而設置system type為SA11X0,SA11X0 Implementations中選擇Compaq iPAQ H3600/H3700。
配置完成之後,需要將內核頭文件拷貝到安裝目錄: cp -dR include/asm-arm $PREFIX/arm-linux/include/asm cp -dR include/linux $PREFIX/arm-linux/include/linux
四、第一次編譯gcc
首先運行configure文件,使用--prefix=$PREFIX參數指定安裝路徑,使用--target=arm-linux參數指定目標機類型,並使用--disable-threads、--disable-shared、--enable-languages=c參數,然後執行make install。這一步將生成一個最簡的gcc。由於編譯整個gcc是需要目標機的glibc庫的,它現在還不存在,因此需要首先生成一個最簡的gcc,它只需要具備編譯目標機glibc庫的能力即可。
五、交叉編譯glibc
這一步驟生成的代碼是針對目標機cpu的,因此它屬於一個交叉編譯過程。該過程要用到linux內核頭文件,默認路徑為$PREFIX/arm-linux/sys-linux,因而需要在$PREFIX/arm-linux中建立一個名為sys-linux的軟連接,使其內核頭文件所在的include目錄;或者,也可以在接下來要執行的configure命令中使用--with-headers參數指定linux內核頭文件的實際路徑。
configure的運行參數設置如下(因為是交叉編譯,所以要將編譯器變數CC設為arm-linux-gcc): CC=arm-linux-gcc ./configure --prefix=$PREFIX/arm-linux --host=arm-linux --enable-add-ons 最後,按以上配置執行configure和make install,glibc的交叉編譯過程就算完成了,這里需要指出的是,glibc的安裝路徑設置為$PREFIXARCH=arm/arm-linux,如果此處設置不當,第二次編譯gcc時可能找不到glibc的頭文件和庫。
六、第二次編譯gcc
運行configure,參數設置為--prefix=$PREFIX --target=arm-linux --enable-languages=c,c++。
運行make install。
到此為止整個交叉編譯環境就完全生成了。
幾點注意事項
第一點、在第一次編譯gcc的時候可能會出現找不到stdio.h的錯誤,解決辦法是修改gcc/config/arm/t-linux文件,在TARGET_LIBGCC2_CFLAGS變數的設定中增加-Dinhibit_libc和-D__gthr_posix_h。

③ 用arm-linux交叉編譯器使用動態庫時搜索標准路徑是什麼

/usr/lib , /橘源usr/libxx xx為數字,一般32或64,x32
標准頭好伍畢文友芹件搜索路徑:/usr/include/

④ 在linux中安裝交叉編譯器時的解包問題

具體操作步驟如下:
1. 下載
在GCC網站上( 3.3.1。可供下載的文件一般有兩種形式:gcc-3.3.1.tar.gz和 2,只是壓縮格式不一樣,內容完全一致,下載其中一種即可。
2. 解壓
根據壓縮格式,選擇下面相應的一種方式解包(以下的「%」表示命令行提示符):
% tar xzvf gcc-3.3.1.tar.gz
或者
% tar jxvf 2
新生成的gcc-3.3.1這個目錄被稱為源目錄,用${srcdir}表示它。以後在出現${srcdir}的地方,應該用真實的路徑來替換它。用pwd命令可以查看當前路徑。
在${srcdir}/INSTALL目錄下有詳細的GCC安裝說明,可用瀏覽器打開 ml閱讀。
3. 建立目標目錄
目標目錄(用${objdir}表示)是用來存放編譯結果的地方。GCC建議編譯後的文件不要放在源目錄${srcdir]中(雖然這樣做也可以),最好單獨存放在另外一個目錄中,而且不能是${srcdir}的子目錄。
例如,可以這樣建立一個叫 gcc-build 的目標目錄(與源目錄${srcdir}是同級目錄):

% mkdir gcc-build
% cd gcc-build
以下的操作主要是在目標目錄 ${objdir} 下進行。
4. 配置
配置的目的是決定將GCC編譯器安裝到什麼地方(${destdir}),支持什麼語言以及指定其它一些選項等。其中,${destdir}不能與${objdir}或${srcdir}目錄相同。
配置是通過執行${srcdir}下的configure來完成的。其命令格式為(記得用你的真實路徑替換${destdir}):
% ${srcdir}/configure --prefix=${destdir} [其它選項]
例如,如果想將GCC 3.3.1安裝到/usr/local/gcc-3.3.1目錄下,則${destdir}就表示這個路徑。
% ../gcc-3.3.1/configure --prefix=/usr/local/gcc-3.3.1 --enable-threads=posix --disable-checking --enable--long-long --host=i386-redhat-linux --with-system-zlib --enable-languages=c,c++,java
將GCC安裝在/usr/local/gcc-3.3.1目錄下,支持C/C++和JAVA語言,其它選項參見GCC提供的幫助說明。
5. 編譯
% make
這是一個漫長的過程。

6. 安裝
執行下面的命令將編譯好的庫文件等拷貝到${destdir}目錄中(根據你設定的路徑,可能需要管理員的許可權):
% make install
至此,GCC 3.3.1安裝過程就完成了。
6. 其它設置
GCC 3.3.1的所有文件,包括命令文件(如gcc、g++)、庫文件等都在${destdir}目錄下分別存放,如命令文件放在bin目錄下、庫文件在lib下、頭文件在include下等。由於命令文件和庫文件所在的目錄還沒有包含在相應的搜索路徑內,所以必須要作適當的設置之後編譯器才能順利地找到並使用它們。
6.1 gcc、g++、gcj的設置
要想使用GCC 3.3.1的gcc等命令,簡單的方法就是把它的路徑${destdir}/bin放在環境變數PATH中。我不用這種方式,而是用符號連接的方式實現,這樣做的好處是我仍然可以使用系統上原來的舊版本的GCC編譯器。
首先,查看原來的gcc所在的路徑:
% which gcc
在系統上,上述命令顯示:/usr/bin/gcc。因此,原來的gcc命令在/usr/bin目錄下。可以把GCC 3.3.1中的gcc、g++、gcj等命令在/usr/bin目錄下分別做一個符號連接:
% cd /usr/bin
% ln -s ${destdir}/bin/gcc gcc33
% ln -s ${destdir}/bin/g++ g++33
% ln -s ${destdir}/bin/gcj gcj33
這樣,就可以分別使用gcc33、g++33、gcj33來調用GCC 3.3.0的gcc、g++、gcj完成對C、C++、JAVA程序的編譯了。同時,仍然能夠使用舊版本的GCC編譯器中的gcc、g++等命令。

⑤ 如何建立Linux下的ARM交叉編譯環境

首先安裝交叉編譯器,網路「arm-linux-gcc」就可以一個編譯器壓縮包。
把壓縮包放到linux系統中,解壓,這樣就算安裝好了交叉編譯器。
設置編譯器環境變數,具體方式網路。如打開 /etc/bash.bashrc,添加剛才安裝的編譯器路徑 export PATH=/home/。。。/4.4.3/bin:$PATH。這樣是為了方便使用,用arm-linux-gcc即可,不然既要帶全路徑/home//bin/arm-linux-gcc,這樣不方便使用。
編譯c文件。和gcc編譯相似,把gcc用arm-linu-gcc代替就是了。編譯出來的就可以放到arm上運行了。</ol>

⑥ 如何在windows上用ndk交叉編譯其他平台程序

目標 :編譯arm64的.so庫

編譯方法:理論上應該有兩種交叉編譯方法,法一,在Linux伺服器上安裝交叉工具鏈,直接用交叉工具鏈進行編譯鏈接;法二,使用ndk完成交叉編譯,因為

ndk已經安裝好交叉編譯工具鏈,以及相關的系統庫和系統頭文件了。這兩種方法的區別在於,linux伺服器上的編譯使用的makefile和ndk使用的.mk
文件顯然不同。原因是ndk作為一個集成編譯環境,制定了一套特定的規則用於生成最終的編譯腳本

這里簡單總結下,如何在windows用ndk進行交叉編譯arm64目標平台的.so庫:

step1:找到ndk開發工具包,官網之類的都可以下載,Android-ndk64-r10-windows-x86_64.rar文件

step2:解壓上述ndk工具包,將包含程序源文件和頭文件的文件夾testProject都放入android-ndk-r10下的samples目錄下。

放在其他地方當然也可以,但是後續相對路徑之類的不太好加,既然其他例子都放這,把代碼放這編譯是最保險的了。

step3:在testProject中增加一個jni的文件夾,必須要添加!!!!!!

step4:在jni文件夾中,添加一個Android.mk的文件,必須要添加!!!!!

step5:在jni文件夾中,添加一個Application.mk的文件與Android.mk並列,必須要添加!!!!!

step6:Android.mk和Application.mk合起來就類似於linux環境下的makefile編譯文件。

如何寫Android.mk,可以參考例子helllo-jni中jni文件夾下的Android.mk。

LOCAL_PATH:=$(call my-dir) #必須要寫的

include $(CLEAR_VARS) #必須要寫的

LOCAL_MODULE:=hello-jni #編譯出來的模塊名稱

LOCAL_SRC_FILES:=hello-jni.c #制定編譯的源文件名稱

include $(BUILD_SHARED_LIBRARY)#放在最後

除了上述變數之外,還有其他的指定的變數,

LOCAL_CFLAGS,用於指定編譯選項,這個和makefile中是完全一樣的,可以指定編譯選項-g,也可以指定編譯宏及宏值

LOCAL_LDLIBS,用於指定鏈接的依賴庫,這個可以makefile也是完全一樣的,可以指定鏈接庫用-l庫名,以及指定庫搜索路徑用_L路徑名

LOCAL_STATIC_LIBRARIES,指定鏈接的靜態庫名,makefile中沒有

LOCAL_C_INCLUDES,用於指定編譯頭文件的路徑,和makefile中不同,路徑前不需要加-I,直接寫路徑即可,可以是相對路徑或絕對路徑,

多個路徑之間用空格隔開。

編寫上述Android.mk碰到的問題有,

(1)使用默認的系統自動載入stl庫頭文件總是出錯,只好手動在LOCAL_STATIC_LIBRARIES指定sources/cxx-stl/stlport/stlport來完成對#include<string>這種c++形式的頭文件載入

(2)使用$(SYSROOT)/usr/include來完成對系統庫頭文件的載入,結果找不到sem_t符號,只好指定platforms/android-L/arch-arm64/usr/include

step7:Application.mk編寫

APP_STL指定使用的stl移植庫,動態或者靜態都行

APP_CPPFLAGS,指定app編譯的編譯選項

APP_ABI指定abi規范類型,例如arm64-v8a,也可以寫成ALL就是把所有的類型全部編一編

APP_PLATFORM指定編譯的platform名稱,這里可以寫成android-L或者不指定全編。

step8:編譯完成後,運行。

啟動cmd,使用cd /D進行到testProject的jni目錄下

step9:將android-ndk-r10下的ndk-build.cmd直接拖拽到cmd中,此時直接敲回車,就可以編譯了。當然也可以加一個 clean,清除編譯中間文件。

step10:檢查下編譯結果,編譯成功後在testProject中多了兩個文件夾與jni並列的,libs和obj。
編譯鏈接後的結果就在libs中!

熱點內容
廣東一區cf刷經驗房密碼都是什麼 發布:2025-02-06 05:46:20 瀏覽:633
加密工具源碼 發布:2025-02-06 05:44:52 瀏覽:13
筆記本可用存儲多大 發布:2025-02-06 05:44:48 瀏覽:157
ftp登錄後沒有反應 發布:2025-02-06 05:29:41 瀏覽:175
linux建目錄命令 發布:2025-02-06 05:29:06 瀏覽:724
安卓所有照片在哪裡 發布:2025-02-06 05:16:32 瀏覽:972
l2緩存作用 發布:2025-02-06 05:15:02 瀏覽:291
快播為什麼連接不了伺服器 發布:2025-02-06 05:12:51 瀏覽:386
不吸煙解壓 發布:2025-02-06 05:12:07 瀏覽:282
php淘汰 發布:2025-02-06 04:59:39 瀏覽:74