交叉編譯ios
⑴ c語言程序exe如何在手機運行
Android設備上的應用程序大都是用Java語言編寫的,但有時我們需要用C語言進行一些底層的開發,但我們一般的PC機CPU都是Intelx86架構,而大多數移動設備CPU都是ARM架構,因此在linux上編譯運行的可執行程序是不能直接在Android手機上運行的,但是我們可以在PC機上交叉編譯出能在ARM平台下運行的程序。
1.安裝交叉編譯工具
首先,我們需要在Linux下安裝 arm-none-linux-gnueabi-gcc交叉編譯工具鏈下載地址(找了好久~_~)
不多說了,放到usr/local/bin目錄下,解壓文件包,解壓後得到一個arm-2009q1文件夾,然後把arm-2009q1下的bin目錄配進環境變數
如果在終端下執行arm-none-linux-gnueabi-gcc -v可以成功的話,就說明配置成功了,如圖
⑵ php可以做APP的後台嗎
用PHP寫App服務端肯定沒問題的。
每家技術企業都會養php技術人員,例如一些系統後台的製作、網站後台的製作、小中型APP的後台數據製作。但大型APP後台最好還是JAVA比較合理。
當然你想在Android/iOS上跑PHP解釋器也是可以的。
把PHP交叉編譯到這些平台即可。
比如我打包的Android上的PHPDroid,以及老外打包的iOS上的DraftCode.
最後,php就是做後台數據分析及前台數據展現等工作的。
php是世界上最好的語言,希望所以的phper能在php的道路上越走越好。
⑶ 如何使用clang+llvm+binutils+newlib+gdb搭建交叉編譯環境
1,Build llvm/clang/lldb/lld 3.5.0等組件
1.0 准備:
至少需要從llvm.org下載llvm, cfe, lldb, compiler-rt,lld等3.5.0版本的代碼。
$tar xf llvm-3.5.0.src.tar.gz
$cd llvm-3.5.0.src
$mkdir -p tools/clang
$mkdir -p tools/clang/tools/extra
$mkdir -p tools/lld
$mkdir -p projects/compiler-rt
$tar xf cfe-3.5.0.src.tar.xz -C tools/clang --strip-components=1
$tar xf compiler-rt-3.5.0.src.tar.xz -C projects/compiler-rt --strip-components=1
$tar xf lldb-3.5.0.src.tar.xz -C tools/clang/tools/extra --strip-components=1
$tar xf lld-3.5.0.src.tar.xz -C tools/lld --strip-components=1
1.1 【可選】使用clang --stdlib=libc++時,自動添加-lc++abi。
libc++組件可以使用gcc libstdc++的supc++ ABI,也可以使用c++abi,cxxrt等,實際上自動添加-lc++abi是不必要的,這里這么處理,主要是為了方便起見。實際上完全可以在「clang++ -stdlib=libc++」時再手工添加-lc++abi給鏈接器。
這里涉及到鏈接時DSO隱式還是顯式的問題,早些時候ld在鏈接庫時會自動引入由庫引入的依賴動態庫,後來因為這個行為的不可控性,所以ld鏈接器的行為做了修改,需要顯式的寫明所有需要鏈接的動態庫,才會有手工添加-lc++abi這種情況出現。
--- llvm-3.0.src/tools/clang/lib/Driver/ToolChain.cpp 2012-03-26 18:49:06.663029075 +0800
+++ llvm-3.0.srcn/tools/clang/lib/Driver/ToolChain.cpp 2012-03-26 19:36:04.260071355 +0800
@@ -251,6 +251,7 @@
switch (Type) {
case ToolChain::CST_Libcxx:
CmdArgs.push_back("-lc++");
+ CmdArgs.push_back("-lc++abi");
break;
case ToolChain::CST_Libstdcxx:
1.2 【必要】給clang++添加-fnolibgcc開關。
這個開關主要用來控制是否連接到libgcc或者libunwind。
註:libgcc不等於libunwind。libgcc_eh以及supc++的一部分跟libunwind功能相當。
註:libgcc_s和compiler_rt的一部分相當。
這個補丁是必要的, 不會對clang的正常使用造成任何影響 ,只有在使用「-fnolibgcc"參數時才會起作用。
之所以進行了很多unwind的引入,主要是為了避免不必要的符號缺失麻煩,這里的處理相對來說是干凈的,通過as-needed規避了不必要的引入。
--- llvm-static-3.5.0.bak/tools/clang/lib/Driver/Tools.cpp 2014-09-10 13:46:02.581543888 +0800
+++ llvm-static-3.5.0/tools/clang/lib/Driver/Tools.cpp 2014-09-10 16:03:37.559019321 +0800
@@ -2060,9 +2060,15 @@
".a");
CmdArgs.push_back(Args.MakeArgString(LibClangRT));
- CmdArgs.push_back("-lgcc_s");
- if (TC.getDriver().CCCIsCXX())
- CmdArgs.push_back("-lgcc_eh");
+ if (Args.hasArg(options::OPT_fnolibgcc)) {
+ CmdArgs.push_back("--as-needed");
+ CmdArgs.push_back("-lunwind");
+ CmdArgs.push_back("--no-as-needed");
+ } else {
+ CmdArgs.push_back("-lgcc_s");
+ if (TC.getDriver().CCCIsCXX())
+ CmdArgs.push_back("-lgcc_eh");
+ }
}
static void addProfileRT(
@@ -7150,24 +7156,50 @@
bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
Args.hasArg(options::OPT_static);
+
+
+
if (!D.CCCIsCXX())
- CmdArgs.push_back("-lgcc");
+ if (Args.hasArg(options::OPT_fnolibgcc)) {
+ CmdArgs.push_back("--as-needed");
+ CmdArgs.push_back("-lunwind");
+ CmdArgs.push_back("--no-as-needed");
+ } else
+ CmdArgs.push_back("-lgcc");
if (StaticLibgcc || isAndroid) {
if (D.CCCIsCXX())
- CmdArgs.push_back("-lgcc");
+ if (Args.hasArg(options::OPT_fnolibgcc)) {
+ CmdArgs.push_back("--as-needed");
+ CmdArgs.push_back("-lunwind");
+ CmdArgs.push_back("--no-as-needed");
+ } else
+ CmdArgs.push_back("-lgcc");
} else {
if (!D.CCCIsCXX())
CmdArgs.push_back("--as-needed");
- CmdArgs.push_back("-lgcc_s");
+ if (Args.hasArg(options::OPT_fnolibgcc))
+ CmdArgs.push_back("-lunwind");
+ else
+ CmdArgs.push_back("-lgcc_s");
if (!D.CCCIsCXX())
CmdArgs.push_back("--no-as-needed");
}
if (StaticLibgcc && !isAndroid)
- CmdArgs.push_back("-lgcc_eh");
+ if (Args.hasArg(options::OPT_fnolibgcc)) {
+ CmdArgs.push_back("--as-needed");
+ CmdArgs.push_back("-lunwind");
+ CmdArgs.push_back("--no-as-needed");
+ } else
+ CmdArgs.push_back("-lgcc_eh");
else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
- CmdArgs.push_back("-lgcc");
+ if (Args.hasArg(options::OPT_fnolibgcc)) {
+ CmdArgs.push_back("--as-needed");
+ CmdArgs.push_back("-lunwind");
+ CmdArgs.push_back("--no-as-needed");
+ } else
+ CmdArgs.push_back("-lgcc");
// According to Android ABI, we have to link with libdl if we are
// linking with non-static libgcc.
--- llvm-static-3.5.0.bak/tools/clang/include/clang/Driver/Options.td 2014-08-07 12:51:51.000000000 +0800
+++ llvm-static-3.5.0/tools/clang/include/clang/Driver/Options.td 2014-09-10 13:36:34.598511176 +0800
@@ -788,6 +788,7 @@
def fomit_frame_pointer : Flag<["-"], "fomit-frame-pointer">, Group<f_Group>;
def fopenmp : Flag<["-"], "fopenmp">, Group<f_Group>, Flags<[CC1Option, NoArgumentUnused]>;
def fopenmp_EQ : Joined<["-"], "fopenmp=">, Group<f_Group>, Flags<[CC1Option]>;
+def fnolibgcc : Flag<["-"], "fnolibgcc">, Group<f_Group>, Flags<[CC1Option, NoArgumentUnused]>;
def fno_optimize_sibling_calls : Flag<["-"], "fno-optimize-sibling-calls">, Group<f_Group>;
def foptimize_sibling_calls : Flag<["-"], "foptimize-sibling-calls">, Group<f_Group>;
def force__cpusubtype__ALL : Flag<["-"], "force_cpusubtype_ALL">;
1.3 llvm的其他補丁。
llvm/clang將gcc toolchain的路徑hard code在代碼中,請查閱tools/clang/lib/Driver/ToolChains.cpp。
找到x86_64-redhat-linux之類的字元串。
如果沒有你系統特有的gcc tripple string,請自行添加。
這個tripple string主要是給llvm/clang搜索gcc頭文件等使用的,不影響本文要構建的toolchain
1.4 構建clang/llvm/lldb
本文使用ninja。順便說一下,llvm支持configure和cmake兩種構建方式。可能是因為工程太大,這兩種構建方式的工程文件都有各種缺陷(主要表現在開關選項上,比如configure有,但是cmake卻沒有等)。llvm-3.4.1就是因為cmake工程文件的錯誤而導致了3.4.2版本的發布。
綜合而言,cmake+ninja的方式是目前最快的構建方式之一,可以將構建時間縮短一半以上。
mkdir build
cd build
cmake \
-G Ninja \
-DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_BUILD_TYPE="Release" \
-DCMAKE_CXX_FLAGS="-std=c++11" \
-DBUILD_SHARED_LIBS=OFF \
-DLLVM_ENABLE_PIC=ON \
-DLLVM_TARGETS_TO_BUILD="all" \
-DCLANG_VENDOR="MyOS" ..
ninja
ninja install
如果系統原來就有clang/clang++的可用版本,可以添加:
-DCMAKE_C_COMPILER=clang \
-DCMAKE_CXX_COMPILER=clang++ \
這樣就會使用系統的clang++來構建llvm/clang
2,測試clang/clang++。
自己找幾個簡單的c/cpp/objc等編譯測試一下即可。完整測試可以在構建時作ninja check-all
3,libunwind/libc++/libc++abi,一套不依賴libgcc, libstdc++的c++運行庫。
3.1 從https://github.com/pathscale/libunwind 獲取代碼。
libunwind有很多個實現,比如gnu的libunwind, path64的libunwind,還有libcxxabi自帶的Unwinder.
這里作下說明:
1),gnu的libunwind會有符號缺失和沖突。
2),libcxxabi自帶的Unwinder是給mac和ios用的,也就是只能在darwin體系構建。目前Linux的實現仍然不全,等linux實現完整了或許就不再需要path64的unwind實現了。
暫時建議使用pathscale的unwind實現。
mkdir -p build
cd build
cmake -G Ninja -DCMAKE_C_COMPILER=clang -DCMAKE_C_FLAGS="-m64" ..
ninja
mkdir -p /usr/lib
cp src/libunwind.so /usr/lib
cp src/libunwind.a /usr/lib
3.2 第一次構建libcxx.
必須先構建一次libcxx,以便後面構建libcxxabi。這里構建的libcxx實際上是使用gcc的libgcc/stdc++/supc++的。
打上這個補丁來禁止libgcc的引入:
diff -Nur libcxx/cmake/config-ix.cmake libcxxn/cmake/config-ix.cmake
--- libcxx/cmake/config-ix.cmake 2014-06-25 06:57:50.000000000 +0800
+++ libcxxn/cmake/config-ix.cmake 2014-06-25 09:05:24.980350544 +0800
@@ -28,5 +28,4 @@
check_library_exists(c printf "" LIBCXX_HAS_C_LIB)
check_library_exists(m ccos "" LIBCXX_HAS_M_LIB)
check_library_exists(rt clock_gettime "" LIBCXX_HAS_RT_LIB)
-check_library_exists(gcc_s __gcc_personality_v0 "" LIBCXX_HAS_GCC_S_LIB)
編譯安裝:
mkdir build
cd build
cmake \
-G Ninja \
-DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_C_COMPILER=clang \
-DCMAKE_CXX_COMPILER=clang++ \
..
ninja
ninja install
3.3,測試第一次構建的libcxx。
使用"clang++ -stdlib=libc++ -o test test.cpp -lstdc++"編譯簡單c++代碼,檢查是否出錯。(如果前面構建clang是已經apply了c++abi的鏈接補丁,這里會出現找不到c++abi的情況,跳過即可)
使用"ldd test"查看test二進制動態庫使用情況。可以發現,test依賴於libgcc_s/libc++/libstdc++。(多少有些不爽了吧?使用了libc++居然還要依賴libstdc++?)
⑷ 嵌入式系統到底是什麼
嵌入式系統到底是什麼
書的話我推薦《嵌入式linux應用開發完全手冊》,很不錯,你有什麼問題可以問我,我通訊大三目前也在研究嵌入式,步驟大致如下:
第一步: 嵌入式開發 pcb設計,一般為開發板的電路裁減和擴充,由開發板原理圖為基礎,畫出PCB和封裝庫,設計自己的電路。
第二步: SOPC技術,一般為FPGA,CPLD開發,利用VHDL等硬體描述語言做專用arm晶片開發,寫出自己的邏輯電路,基於ALTER或XILINUX的FPGA做開發。Arm9
第三步: SOC設計,分前端,後端實現,這是硬體設計的核心技術:晶片設計.能做到這步,已經不屬於平凡的技術人員。arm9開發板
軟體道路:
第一步:bootloader的編寫,修改, 通過這步熟悉ARM硬體結構,學習ARM組合語言,閱讀ARM的晶片手冊,感覺就是像操作51微控制器一樣操作ARM晶片.這一步最好的兩個參考資料就是:晶片手冊和bootloader原始碼。
第二步:系統移植, 驅動開發, 我只做過linux方向,所以也推薦學習嵌入式linux系統,作為標准體系,他開源而且可以獲得大量學習資料.作業系統是整個電腦科學的核心,熟悉 kernel實屬不易,kernel, 驅動
開發的學習,沒有什麼捷徑,只有多讀程式碼,多寫程式碼,熟悉系統API.. understanding linux kernel , linux device driver 都是不可多得的好書,值得一看。
第三步:應用程式的編寫,各種GUI的移植,qt , minigui都被大量採用,兩種思想都類似,熟悉一種就可以。
軟體道路中,驅動系統應該是最深入的部分,不是短時間可以掌握的,需要有勇氣和耐心。嵌入式開發,軟硬結合,因為硬體條件比PC差很多,所以肯定會遇見不少問題,因此實踐的勇氣更加重要.有問題就解決問題,無數次的實驗,也許是解決問題的必由之路
以上回答你滿意么?
嵌入式是做什麼的
嵌入式系統通常是指內部包含只能控制器的裝置,它具有整合度高,體積小、反應速度快、智慧化、 穩定及可靠性強等特點。
舉一個簡單的例子就能明白了
比如說我們的電腦都裝有作業系統,因為安裝了作業系統以後會使電腦的效用被充分的利用起來,但是 現在智慧化的裝置、各種儀器、電子裝置越來越多,比如說我們的手機、智慧洗衣機、智慧電冰箱等等 ,這些東西不可能把電腦用的作業系統安裝在其中,只能開發一些體積小的、功能完備的小型系統安裝 在這些東西上,被安裝的這些作業系統就叫做「嵌入式的作業系統」
什麼是嵌入式系統?
說白了目前有兩個CPU硬體系列,
一是帶電扇的CPU:目前的電腦,費電,發熱大,效能高;
二是不帶電扇的CPU:目前的手機,微控制器等。也就是嵌入式,省電,發熱小。
其實只要是CPU都可以裝作業系統的。只是有的硬碟太小了,裝不下。或記憶體太小執行不了而已。
安卓是基於Linux核心,但不是Linux作業系統。
「Android是一種以Linux為基礎的開放原始碼作業系統,主要使用於便攜裝置。目前尚未有統一中文名稱,中國大陸地區較多人使用「安卓」或「安致」。Android作業系統最初由Andy Rubin開發,最初主要支援手機。2005年由Google收購注資,並組建開放手機聯盟開發改良,逐漸擴充套件到平板電腦及其他領域上。Android的主要競爭對手是蘋果公司的iOS以及RIM的Blackberry OS。2011年第一季度,Android在全球的市場份額首次超過塞班系統,躍居全球第一。 2012年2月資料,Android占據全球智慧手機作業系統市場52.5%的份額,中國市場佔有率為68.4%。」
「Android 是運行於 Linux kernel之上,但並不是GNU/Linux。因為在一般GNU/Linux 里支援的功能,Android 大都沒有支援,包括Cairo、X11、Alsa、FFmpeg、GTK、Pango及Glibc等都被移除掉了。Android又以bionic 取代Glibc、以Skia 取代Cairo、再以opencore 取代FFmpeg 等等。Android 為了達到商業應用,必須移除被GNU GPL授權證所約束的部份,例如Android將驅動程式移到 userspace,使得Linux driver 與 Linux kernel徹底分開。bionic/libc/kernel/ 並非標準的kernel header files。Android 的 kernel header 是利用工具由 Linux kernel header 所產生的,這樣做是為了保留常數、資料結構與巨集。」
參考資料: ke./view/1241829#5_4
嵌入式 移植到底是什麼? 5分
這個話題太大了,
要看你是移植什麼了,可以是作業系統,可以是應用軟體,甚至是一些編編譯器。
你要先看你要做的是什麼。
PC上的是交叉編譯工具,這個交叉編譯戶具的作用,就是可以編譯出可以直接在嵌入式平台上可以直接執行的程式。
嵌入式培養是什麼意思?
嵌入式培養是什麼意思?目前高校在招生的時候通常會提到嵌入式人才培養,也許你並不了解嵌入式是啥?其實就是常常談到的嵌入式,主要說其應用,就是一個嵌入式Linux系統,是根據不同需求而開發的系統,不同一般的windows系統,需要那麼大個頭,例如當前的拿在手裡的平板電腦,如果你還用桌上型電腦那樣的系統,那麼相對應的硬體一定不能小,功耗也大還得插電吧。可以想像一下,那最後做出來產品是沒人要的!
國內第一家嵌入式人才培養機構是華清遠見。那麼嵌入式培養從字面意思上講,顯而易見就是嵌入式人才的培養,不管是大學裡面的培養,還是畢業之後社會上的嵌入式培養都是培養你嵌入式開發的技能。其實就是這么簡單的意思。
為什麼要做嵌入式人才的培養?只因當前技術的潮流是奔著智慧時代、自動化發展去的。且從事嵌入式開發工作薪資待遇比起一般的打工者,算是大富大貴了!從2015年行業薪資來看,嵌入式開發是所有行業內平均薪資待遇最好的職業。也是國家大力扶持的熱門行業。
中國目前來講還算是發展中國家,遠遠落後歐美、日本這樣的一些老工業強國,現在國家也是極力的向他們靠近,學習他們的先進技術,不得不說嵌入式技術就是非常重要的一環。打個比方,以前很多工廠的工人做一些工種都是手工的,需要大量的人,現在開發一台自動化裝置,那麼這些人都面臨著失業,自動化之後效率變高,成本降低。
當前更是無人機、無人駕駛、可穿戴裝置、智慧家居、智慧城市等相關產業不斷涌現,嵌入式系統、基礎晶片、各類感測器及軟體的應用越來越加深入和廣泛。所以嵌入式人才培養迫在眉睫。
華清遠見教育集團(行業內最早、最大的嵌入式職業教育機構)總裁季久峰表示,在嵌入式人才培養上,應始終堅持「興趣學習」的課程設計原則。嵌入式教學依靠單一的、過時的開發板的時代已經過去了,把當下新潮的硬體產品拿到課堂上來,才能夠真正的激發學員的學習熱情。華清遠見集團擁有幾十人的專業研發團隊,目前已成功研發諸如開源平板電腦、智慧手錶、智慧機頂盒、智慧小車、智慧手環等時下最流行的產品,並快速應用到課程內容和專案實訓中,這樣才能真正的幫助學員成長,提高實戰能力。
嵌入式到底是什麼?對51 msp430 stm32的基本使用都掌握。但是還是不太理解他們之間本質上
恩 我也是剛學系統的 ,說的不好不要見怪。
對於51 msp430 stm32等微控制器,就你現在情況來看還是在裸奔,沒跑過什麼作業系統。就作業系統而言按功能劃分為工業和家庭之類的,有什麼ucos FreeRTOS linux wince等等嵌入式作業系統。
優勢方面:在系統上可以更加合理的分配資源,讓資源利用盡可能的少浪費,做到多工化,bug少(畢竟系統神馬的是一群牛逼的大大合力完成的,且進過時間的考驗,肯定比我們裸奔強多了),且比普通微控制器系統更適合完成復雜的應用,還有點重要的是穩定性好,我們裸奔的程式搞大了,難免會有很多bug,用作業系統可以增加程式的穩定性,和高效性。
額 暫時寫這么多 有問題你再問吧 。
我是大一軟體工程嵌入式的,請問以後到底是什麼方向
這個看你興趣了,嵌入式屬於搞開發的,現在很多方面都用到了,搞資料可能相對要枯燥些,畢竟都是和資料打交道
嵌入式 是做什麼的?
嵌入式實際上是軟體硬體相結合的嵌入式系統。
軟體一般是一種計算機作業系統,比如Linux硬體則是執行使用者要求的執行裝置,比如小電機,電路板等等。
做嵌入式開發,則分為軟體開發和硬體開發兩方面。
我現在的工作就屬於嵌入式,是電視機的開發。
需要學習的有:
軟體上至少要掌握一種作業系統比如Linux,一門程式語言比如C語言,還要掌握一些與硬體會話的匯編和編譯原理等。
硬體方面至少要有電路基礎。
嵌入式是什麼意思?
1、簡單的說就是用於控制、監視或者輔助操作機器和裝置的裝置。
2、可以理解為微型電腦。比如平板電腦就是一個嵌入式系統,智慧手機也是嵌入式系統,銀行取款機也是.......可以說凡是能智慧互動控制的都是嵌入式系統。
3、打個比方說:拿一個嵌入式開發板,裝上螢幕,就能成為平板電腦。裝個溫度探測器,就可以成為溫度檢測儀。裝個螢幕+GPS模組,就能成為車載導航儀。裝個讀卡器+3G模組,就可以成為POS機......當然實際開發起來沒有說的這么簡單,會設計硬體開發+軟體開發等各方面。
嵌入式 是什麼
(Institute of Electrical and Electronics Engineers,美國電氣和電子工程師協會)對嵌入式系統的定義:「用於控制、監視或者輔助操作機器和裝置的裝置」。原文為:Devices Used to Control,Monitor or Assist the Operation of Equipment,Machinery or Plants)。
嵌入式系統是一種專用的計算機系統,作為裝置或裝置的一部分。通常,嵌入式系統是一個控製程式儲存在ROM中的嵌入式處理器控制板。事實上,所有帶有數字介面的裝置,如手錶、微波爐、錄影機、汽車等,都使用嵌入式系統,有些嵌入式系統還包含作業系統,但大多數嵌入式系統都是由單個程式實現整個控制邏輯。[1]
從應用物件上加以定義,嵌入式系統是軟體和硬體的綜合體,還可以涵蓋機械等附屬裝置。國內普遍認同的嵌入式系統定義為:以應用為中心,以計算機技術為基礎,軟硬體可裁剪,適應應用系統對功能、可靠性、成本、體積、功耗等嚴格要求的專用計算機系統。