當前位置:首頁 » 編程軟體 » 編譯libc32位庫

編譯libc32位庫

發布時間: 2025-05-03 13:32:21

Ⅰ 如何編譯OpenWrt

Openwrt 官方正式的發行版是已編譯好了的映像文件(後綴名bin或trx、trx2),此映像文件可從Openwrt官方網站的下載頁面中輕松獲取到,連接地址為 OpenWrt官方網站。這些編譯好的映像文件是基於默認的配置設置,且只針對受支持的平台或設備的。因此,為什麼要打造一個自己的映像文件,理由有以下四點:
您想擁有一個個性化的配置OpenWrt(彰顯個性,在朋友圈子裡顯擺顯擺,開個玩笑);
您想在實驗性的平台上測試OpenWrt;
您參與測試或參與開發OpenWrt的工作;
或者,最簡單的目的就是為了保持自己的Openwrt為最新版本;
若想實現上述目的,其實很簡單,按下述文字即可成功編譯出一個您的Openwrt來。
准備工作
在開始編譯Openwrt之前需要您做些准備工作;與其他編譯過程一樣,類似的編譯工具和編譯環境是必不可少的:
一個構建OpenWrt映像的系統平台,簡單說就是准備一個操作系統(比如Ubuntu、Debian等);
確保安裝了所需的依賴關系庫, (在debian系統中就是安裝各種需要的軟體包)
OpenWrt源代碼副本
首先, 開機登陸到支持編譯Openwrt的操作系統(廢話了)。實體機或者虛擬機(Vmware 或者 Qemu)里的操作系統都行,這里推薦使用linux系統。 bsd和mac osx系統也可以編,但不推薦,且未驗證是否可編譯成功。下文假定您使用的是Debian操作系統,使用 apt-get 來管理包. 替代的選擇是 Ubuntu (分支 Kubuntu, Xubuntu 等即可)。
第二步, 就是安裝所需要的各種軟體包, 包括編譯器,解壓工具,特定的庫等. 這些工作可以簡單的通過鍵入以下命令 (通常需要root 或者是 sudo 許可權),以root許可權安裝下列軟體包(可能並不完整,會有提示,提示缺少即裝就可以了):
32位(x86)請執行下列命令:
# apt-get install build-essential asciidoc binutils bzip2 gawk gettext \
git libncurses5-dev libz-dev patch unzip zlib1g-dev

64位(x86_64)請執行下列命令(多裝了哪些庫或軟體包呢?請您仔細看一看哦):
# apt-get install build-essential asciidoc binutils bzip2 gawk gettext \
git libncurses5-dev libz-dev patch unzip zlib1g-dev ia32-libs \
lib32gcc1 libc6-dev-i386

參考 本列表中 所列的編譯環境所需要軟體包或庫。
某些依賴的為庫或軟體包也許操作系統中已經安裝過,此時apt-get會作出提示(提示您忽略或重新安裝的),別緊張,放輕鬆些,編譯Openwrt不會像編譯DD-WRT那樣難的(至少本人是體會到了編譯DD-WRT的難)。
最後下載一份完整的 Openwrt 源碼到編譯環境中。關於Openwrt的源代碼下載,途徑有二,一是通過 svn ,一是通過 git,建議使用 svn ,因為Openwrt主要以 svn 來維護Openwrt系統的版本。另外,請注意Openwrt中不同的分支版本,一個是用得較多的開發快照,俗稱 trunk,二是穩定版,俗稱 backfire。
安裝Subversion
若你想通過svn下載源代碼,你需安裝 Subversion。Subversion,或稱SVN, 是OpenWrt的project中用來控製版本的系統,它非常類似的 CVS的界面和使用條款。 執行下述命令即可安裝SVN,很容易的:
# apt-get install subversion

Subversion安裝完畢,通過SVN命令可獲取得到一份OpenWrt純凈源代碼。您還得創建一個目錄以便存放獲取得到的Openwrt源代碼,要獲取源代碼你還得輸入subversion命令來獲取 (svn里這種操作稱之為'check out') 。命令很簡單的,繼續看下去就能見到了,別著急,耐心點兒。
編譯流程
編譯專屬於您的設備的特定Openwrt固件以一下五個步驟:
通過Subversion命令獲得源代碼;
更新(或安裝) package feeds〔package feeds無法確切翻譯,待譯吧);
創建一個默認配置以檢查編譯環境是否搭建好了 (假如需要的話);
用Menuconfig來配置即將編譯生成的固件映像文件的配置項;
最後開始編譯固件;
下載源代碼
最後,下載一份完整的OpenWrt源代碼。你可選擇:
下載穩定發行版,或
下載開發版 (俗稱"trunk"版)。
使用發行版的源碼
截止本文時, Openwrt公開發行的穩定版為 OpenWrt 10.03 "backfire"。此版本是最穩定的,但也許不包括最新更新的補丁或最新編寫的出的新功能。
下述代碼即舉例說明了通過svn從brandkfire獲得backfire源代碼(此版本意思是從trunk分支的補丁也在backfire版本中了,即包含修復補丁):
# mkdir OpenWrt/
# cd OpenWrt/
# svn co svn://svn.openwrt.org/openwrt/branches/backfire

註解: 上述svn命令將在當前目錄創建一個 OpenWrt/backfire/ 子目錄,此目錄包含此命令獲取到的源代碼。
您也可以通過下述命令,下載不含修復補丁的backfire的原版源碼:
# svn co svn://svn.openwrt.org/openwrt/tags/backfire_10.03

使用開發版源代碼
當前的開發版本分支(trunk)已包含最新的實驗補丁。此分支或許還突破了Openwrt原來所不支持的硬體設備的限制哦,驚喜的同時也有風險存在。因此,編譯trunk版,慎之~
# mkdir OpenWrt/
# cd OpenWrt/
# svn co svn://svn.openwrt.org/openwrt/trunk/

更多詳細資料詳見: https://dev.openwrt.org/wiki/GetSource.
跟進並更新源代碼
因Openwrt的源代碼隨時都會變動,故此命令將確保您所獲取得到的源碼的最新性。下述假設您用的是backfire版本的源碼:
## Here, backfire is the directory name of the current release branch you're tracking
# cd OpenWrt/backfire/
# svn up

'svn up' 命令用於更新SVN上更新了,但本地尚未更新的這部分源代碼(本人實踐證明此命令會將本地源碼與SVN上的源碼先比較,若SVN有更新才會下載更新的部分,很實用的一個命令)。如果未指定目標路徑,則此命令將更新當前目錄及當前目錄的子目錄內的源碼。
Feeds下載
Feeds即為包含到你的OpenWrt環境中的額外軟體包的索引之類的。(feed譯名很多,莫衷一是,至2008年底為止,還沒有一個十分通用而備受認可的中文譯名;所以此文當中我們用英文feed來稱呼)。 最主要的Feeds有以下三個:
'packages' - 路由的基本功能,
'LuCI' - OpenWrt默認的GUI(WEB管理界面), 及
'Xwrt' - 其他的GUI。
一般情況,你至少需要含 'packages' 和 'LuCI'兩個Feeds。
下載完feeds之後, (為編譯OpenWrt的recipies額外的預定義包) 您可以檢查哪些feeds要包括在內。編輯在你的編譯環境的根目錄下的'feeds.conf.default'文件。
然後使用下列命令開始下載(註:可能你需要先運行cd trunk進入trunk目錄才能成功執行下列命令):
# ./scripts/feeds update -a

在此之後,下載的軟體包需要安裝。亦即指的下邊的命令啦。若路過下邊的install命令則後續make menuconfig將無法成功執行!(註:可能你需要先運行cd trunk進入trunk目錄才能成功執行下列命令):
# ./scripts/feeds install -a

只需編輯Feeds的配置文件或運行更新命令,即可很方便地更新或添加新的實驗性的packages到源碼中並編譯到OpenWrt固件去。
注意:請老壇友及舊的新聞組成員們注意了,這一步取代了創建符號鏈接symlinks的老辦法哦。
更新Feeds
諸如此類源碼,你得定期更新Feeds。 通過如上相同的命令:
# ./scripts/feeds update -a
# ./scripts/feeds install -a

注意:若你清楚地知道你不需添加新的packages到menuconfig中去,那麼你可在更新Feeds時跳過這一步。
生成配置
You may not have to make configration always after updating sources and feeds, but making it ensures that all packages from source and feeds are correctly included in your build configuration.
Defconfig
下一步是檢查編譯環境,若可進行編譯則生成默認配置:
# make defconfig

若defconfig回顯提示缺少軟體包或編譯庫等依賴,則按提示安裝所缺軟體包或庫等即可,不難的,細心點就行。
Menuconfig
menuconfig是一個基於文本的工具,它處理選擇的目標(需要還是不需要)、編譯生成軟體包(openwrt下是IPKG格式)以及內核選項(編譯成模塊還是內核)等等
# make menuconfig

在你離開並保存配置文件(默認都是.config)後,將自動配置依賴關系,讓你可以著手編譯更新的固件。
大眾可通過'menuconfig'這一簡單的圖形化的配置環境,非常輕松地編譯出專屬您本人的OpenWrt固件。
可以用'menuconfig',以開發的意圖來編譯OpenWrt的固件,為自己(個人)創造一個結構簡單但是功能強大的環境。(上句實在難翻譯,只能意譯。並且也請大家都學習下編譯OP固件,讓以OP固件盈利的人丟掉那骯臟的飯碗!)
Menuconfig或多或少有些難以說明的地方,即使是最專業的配置,也可以尋求幫助並加以解決。 需要你指定何種目標平台,要包含的package軟體包和內核模塊等均需要你指定,配置標準的過程中會包括修改:
目標平台(即路由器何種架構,BCM呢還是AR均可選擇)
選擇要包含的package軟體包
構建系統設置
內核模塊
Target system is selected from the extensive list of supported platforms, with the numerous target profiles – ranging from specific devices to generic profiles, all depending on the particular device at hand. Package selection has the option of either 'selecting all package', which might be un-practical in certain situation, or relying on the default set of packages will be adequate or make an indivial selection. It is here needed to mention that some package combinations might break the build process, so it can take some experimentation before the expected result is reached. Added to this, the OpenWrt developers are themselves only maintaining a smaller set of packages – which includes all default packages – but, the feeds-script makes it very simple to handle a locally maintained set of packages and integrate them in the build-process.
假如你需要LuCI, 要到Administration 菜單里,在LuCI組件的子菜單下, 並選擇: luci-admin-core, luci-admin-full, and luci-admin-mini組件包。
假如你不需要PPP,你可到Network菜單下取消對它的選擇,以便編譯時不包含此組件。
Menuconfig用法: 確保這些組件包是以 '*'星號標記而不是 'M'標記。
如果你是以星號 '*'標記該組件包, 則該組件包將編譯進最終生成的OpenWrt固件中。
如果你僅以 'M'標記該組件包, 則該組件包將不會編譯進最終生成的OpenWrt固件中。
The final step before the process of compiling the intended image(s) is to exit 'menuconfig' – this also includes the option to save a specific configuration or load an already existing, and pre-configured, version.
Exit and save.
Source Mirrors
The 'Build system settings' include some efficient options for changing package locations which makes it easy to handle a local package set:
Local mirror for source packages
Download folder
In the case of the first option, you simply enter a full URL to the web or ftp server on which the package sources are hosted. Download folder would in the same way be the path to a local folder on the build system (or network). If you have a web/ftp-server hosting the tarballs, the OpenWrt build system will try this one before trying to download from the location(s) mentioned in the Makefiles . Similar if a local 'download folder', residing on the build system, has been specified. The 'Kernel moles' option is required if you need specific (non-standard) drivers and so forth – this would typically be things like moles for USB or particular network interface drivers etc.
編譯固件
萬事具備,只欠東風,通過下面簡單的make命令來編譯:
# make

在多核電腦中編譯
具有多核CPU處理器的電腦進行編譯,使用下述參數可令編譯過程加速。 常規用法為 <您cpu處理器的數目 + 1> – 例如使用3進程來編譯 (即雙核CPU), 命令及參數如下:
# make -j 3

後台編譯
若你在這個系統內編譯OpenWrt的同時還處理其他,可以讓閑置的I/O及CPU來在後台編譯固件 (雙核CPU):
# ionice -c 3 nice -n 20 make -j 2

編譯簡單的基本的軟體包
當你為OpenWrt開發或打包軟體包,編譯簡單的基本的軟體包可以很輕易地編譯該軟體包 (例如, 軟體包cups):
# make package/cups/compile V=99

一個在Feeds里的軟體包大約是這樣子的:
# make package/feeds/packages/ndyndns/compile V=99

編譯錯誤
如果因某種不知道的原因而編譯失敗,下面有種簡單的方法來得知編譯到底錯在哪裡了:
# make V=99 2>&1 |tee build.log |grep -i error

上述編譯命令意為:V99參數,將出錯信息保存在build.log,生成輸出完整詳細的副本(with stdout piped to stderr),只有在屏幕上顯示的錯誤。
舉例說明:
# ionice -c 3 nice -n 20 make -j 2 V=99 CONFIG_DEBUG_SECTION_MISMATCH=y 2>&1 \
|tee build.log |egrep -i '(warn|error)'

The above saves a full verbose of the build output (with stdout piped to stderr) in build.log and outputs only warnings and errors while building using only background resources on a al core CPU.
一鍵編譯
即使用腳本來編譯Openwrt固件。許多朋友編譯Openwrt是用的腳本來編譯的,詳見: https://forum.openwrt.org/viewtopic.php?id=28267
生成的固件在哪
編譯成功後所生成的固件文件位於bin目錄下,可用如下命令查看:
# cd bin/
# ls */

清理
編譯OpneWrt時你可能需要一個清潔干凈的編譯環境。 以下操作有利用編譯工作:
清潔
清潔trunk/ 目錄,在編譯過程中使用「make clean」命令即可。 此命令將刪除bin目錄和build_dir目錄下的所有文件及文件夾
## See CAUTION below
# make clean

Ⅱ 新人求教,編譯一個最簡單的Android程序,提示下面的錯誤咋解決

注意以下事項:
1、32位系統下的編譯

如果需要在32位系統中編譯android系統,在編譯前需要對部分makefile進行修改

首先修改build/core/main.mk,修改的內容如下所示:

-ifneq (64,$(findstring 64,$(build_arch)))

+ifneq
(i686,$(findstring i686,$(build_arch)))

$(warning
************************************************************) $(warning You are attempting to build on a 32-bit system.)

$(warning Only 64-bit build environments are supported beyond froyo/2.2.)

其次修改如下四個文件:

external/clearsilver/cgi/Android.mk
external/clearsilver/java-jni/Android.mk
external/clearsilver/util/Android.mk
external/clearsilver/cs/Android.mk # This forces a 64-bit build for Java6
-LOCAL_CFLAGS += -m64
-LOCAL_LDFLAGS += -m64
+LOCAL_CFLAGS += -m32
+LOCAL_LDFLAGS += -m32即將LOCAL_CFLAGS和LOCAL_LDFLAGS由-m64改為-m32,從而指定使用32位系統進行編譯如果使用 64bit 的操作系統編譯,這些就都不用修改,但記得需要安裝:For 64-bit servers the following extra packages may be needed:
"sudo apt-get install libc6-dev-i386" (libc6-dev-amd64 if AMD CPU)
"sudo apt-get install g++-multilib lib32ncurses5-dev lib32z1-dev"
還有 jdk64bit 的版本編譯2 、build/core/base_rules.mk:128:*** frameworks/opt/emoji/jni:
.... libgl2jni already defined by framwworks/base/opengl/tests/gl2_jni/jni 停止

從編譯規則上看:
# Make sure that this IS_HOST/CLASS/MODULE combination is unique.
mole_id := MODULE.$(if \
$(LOCAL_IS_HOST_MODULE),HOST,TARGET).$(LOCAL_MODULE_CLASS).$(LOCAL_MODULE)
ifdef $(mole_id)
$(error $(LOCAL_PATH): $(mole_id) already defined by $($(mole_id)))
endif

在framwworks/base/opengl/tests/gl2_jni/下面定義的android.mk定義了:
LOCAL_MODULE := libgl2jni
include $(BUILD_SHARED_LIBRARY)
導致生成的動態庫重復,這是不對的,修改tests這個目錄不參與編譯即可,最直接的辦法刪除掉framwworks/base/opengl/tests/gl2_jni這個文件夾

3、AIDL 編譯報couldn't find import for class原因
「AIDL服務只支持有限的數據類型,因此,如果用AIDL服 務傳遞一些復雜的數據就需要做更一步處理。AIDL服務支持的數據類型如下:
Java的簡單類 型(int、char、boolean等)。不需要導入(import)。String和 CharSequence。不需要導入(import)。
List和 Map。但要注意,List和Map對象的元素類型必須是AIDL服務支持的數據類型。不需要導入(import)。AIDL自動生成 的介面。需要導入(import)。
實現 android.os.Parcelable介面的類。需要導入(import)。
其中後兩種數據類 型需要使用import進行導入,傳遞不需要 import的數據類型的值的方式相同。傳遞一個需要import的數據類型的值(例如,實現android.os.Parcelable 介面的類)的步 驟略顯復雜。除了要建立一個實現android.os.Parcelable介面的類外,還需要為這個類單獨建立一個aidl文件,並使用parcelable關鍵字進行定義。」
沒有加LOCAL_AIDL_INCLUDES += xxx ,所以找不到我的parcelable aidl文件。

修改android源碼根目錄下的build/core/pathmap.mk把你的目錄加進去,此時再make update-api

4、老是提示 @Override錯誤 方法未覆蓋其父類的方法
使 用JDK1.6編譯沒有問題,使用JDK1.5編譯,會報@Override方法未覆蓋其父類的方法。實際上這個方法是類實現的介面中方法,
但是,這個語 法的jdk1.6的下面是可以通過的,也就是說jdk1.6認為類覆蓋父類方法與實現介面方法都叫override,而jdk1.5不
是這樣認為的,不知 道這是當初jdk1.5的bug,還是當初就是認為覆蓋父類方法與實現介面方法是不一樣的,不得而知。但是從
OO角度來看,覆蓋父類方法與實現介面方法都 可以認為override,因為他們目的都是一樣的,都是為了重用,都是多態的一種
表現方式。

更改jdk版本為1.6即可

5、編譯alsa-lib庫錯誤

android系統開發移植alsa-lib庫的過程中編譯的時候出現了如下的錯誤
/tmp/cckyaR40.s: Assembler messages:
/tmp/cckyaR40.s:2763: Error: selected processor does not support `mrs ip,cpsr'
/tmp/cckyaR40.s:2764: Error: unshifted register required -- `orr r2,ip,#128'
/tmp/cckyaR40.s:2765: Error: selected processor does not support `msr cpsr_c,r2
字面的意思報的是匯編錯誤,選擇的處理器不支持mrs和msr指令。
原來的ARM指令有32位和16位兩種指令模式,16位為thumb指令集,thumb指令集編譯出的代碼佔用空間小,
而且效率也高,所以android的arm編譯器默認用的是thumb模式編譯,問題在於alsa的代碼中有部分的內容
用到了32位的指令,所以才會報如下的錯誤,修改的方法也很簡單,在Android.mk中加入如下內容即可:
LOCAL_ARM_MODE := arm
android的編譯系統中LOCAL_ARM_MODE變數的取值為arm或者thumb,代表32位和16位兩種arm指令集,默認為thumb
prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/../lib/gcc/arm-eabi/4.4.0/../../../../arm-eabi/bin/ld: failed to set dynamic section sizes: Bad value

collect2: ld returned 1 exit status
make: *** [out/target/proct/merlin/obj/SHARED_LIBRARIES/libasound_intermediates/LINKED/libasound.so] 錯誤 1
解決此問題將alsa-lib/include/config.h文件中的如下宏定義去掉即可:
#define VERSIONED_SYMBOLS

開發過程中碰到過很多錯誤,後續再一一總結記錄下來,有些忘記了。。

在android.mk中編譯:

include $(CLEAR_VARS)
$(call add-prebuilt-files, STATIC_LIBRARIES, libyfcdca.a)

出現提示需要定義:LOCAL_MODULE_TAGS := optional 一般修改方法是:

build\core\definitions.mk 中的宏定義變數:

define include-prebuilt
include $$(CLEAR_VARS)
LOCAL_SRC_FILES := $(1)
LOCAL_BUILT_MODULE_STEM := $(1)
LOCAL_MODULE_SUFFIX := $$(suffix $(1))
LOCAL_MODULE := $$(basename $(1))
LOCAL_MODULE_CLASS := $(2)
include $$(BUILD_PREBUILT)
endef

在這里增加一個LOCAL_MODULE_TAGS := optional

但是這需要修改android源碼,如果不是自已的android系統,這么做就麻煩了,所以必須想其它辦法解決:

#include $(CLEAR_VARS)
#$(call add-prebuilt-files, STATIC_LIBRARIES, libyfcdca.a)

include $(CLEAR_VARS)
LOCAL_SRC_FILES := libyfcdca.a
LOCAL_BUILT_MODULE_STEM := libyfcdca.a
LOCAL_MODULE_SUFFIX := lib
LOCAL_MODULE := yfcdca
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
LOCAL_MODULE_TAGS := optional
include $(BUILD_PREBUILT)

如此即可了。

Ⅲ 64位linux下面的GCC如何編譯出一個32位可執行程序

在64位Linux環境下,使用GCC編譯32位可執行程序並不困難,但需要確保你的編譯環境具備相應支持。默認安裝的GCC編譯器可能無法直接編譯64位程序,因為缺少64位機器指令相關的文件,導致在編譯過程中出現類似錯誤:

"In file included from /usr/include/features.h:378, from /usr/include/assert.h:37, from ../../../include/tinyxml/tinystr.h:42, from ../../../src/tinyxml/tinystr.cpp:32: /usr/include/gnu/stubs.h:9:27: error: gnu/stubs-64.h: 沒有那個文件或目錄"

解決方法是安裝gcc所有支持文件,通過命令「sudo apt-get install gcc-multilib」進行安裝。安裝過程中,系統會提示需要安裝一系列額外的軟體包,例如:

cpp-4.4, g++-4.4, gcc-4.4, gcc-4.4-base, gcc-4.4-multilib, lib64gcc1, lib64gomp1, libc6-amd64, libc6-dev-amd64, libgcc1, libgomp1, libstdc++6, libstdc++6-4.4-dev

安裝這些軟體包後,你可以通過在編譯命令中加上-m32參數來指定編譯32位程序。例如,使用「gcc -m32 -o myprogram myprogram.c」來編譯32位程序。

需要注意的是,編譯32位程序需要確保目標系統支持32位架構。如果你的目標系統是32位的Windows XP,你可以使用上述方法編譯出能在32位系統上運行的程序;同樣地,對於64位的Windows Vista、32位的Ubuntu和64位的Ubuntu,也可以編譯相應的32位或64位程序。

然而,如果你在老師的題目中遇到困難,可能是因為具體的需求或條件未詳細說明。建議與老師進一步溝通,了解具體的題目要求,以確保正確理解和執行任務。

Ⅳ Ubuntu14.04 用arm-linux-gcc 4.4.3 配置交叉編譯環境問題

安裝步驟

1、將壓縮包arm-linux-gcc-4.4.3.tar.gz存放在一個目錄下,這個目錄就是你等會解壓縮的目錄,以後這個目錄就不能隨便刪掉了

熱點內容
loadrunner腳本錄制 發布:2025-05-04 01:23:04 瀏覽:613
Linux的redis啟動 發布:2025-05-04 01:23:03 瀏覽:144
安卓手機日本旅行下什麼軟體 發布:2025-05-04 01:14:37 瀏覽:478
c語言system函數 發布:2025-05-04 00:43:42 瀏覽:563
雲服務伺服器的配置 發布:2025-05-04 00:34:14 瀏覽:756
怎麼看雲伺服器的硬碟情況 發布:2025-05-04 00:29:04 瀏覽:841
福特撼路者怎麼配置鑰匙一鍵升窗 發布:2025-05-04 00:21:24 瀏覽:415
老梁說編程 發布:2025-05-04 00:16:19 瀏覽:954
php文件編碼 發布:2025-05-04 00:11:50 瀏覽:800
php炒粉 發布:2025-05-04 00:03:35 瀏覽:904