❶ 交叉編譯器的原理
編譯是從源代碼(通常為高級語言)到能直接被計算機或虛擬機執行的目標代碼(通常為低階語言或機器語言)的翻譯過程。然而,也存在從低階語言到高階語言的編譯器,這類編譯器中用來從由高階語言生成的低階語言代碼重新生成高階語言代碼的又被叫做反編譯器。也有從一種高階語言生成另一種高階語言的編譯器,或者生成一種需要進一步處理的的中間代碼的編譯器(又叫級聯)。
典型的編譯器輸出是由包含入口點的名字和地址, 以及外部調用(到不在這個目標文件中的函數調用)的機器代碼所組成的目標文件。一組目標文件,不必是同一編譯器產生,但使用的編譯器必需採用同樣的輸出格式,可以鏈接在一起並生成可以由用戶直接執行的可執行程序。
❷ 交叉編譯時提示 對'__C_ctype_b'的未定義引用
出現這種情況的原因,主要是C/C++編譯為obj文件的時候並不旅賣需要函數的具體實現,只要有函數的原型即可。但是在鏈接為可執行文件的時候就必須要具體的實現了。如果錯誤是未聲明的引用,那就是找不到函數的原型,解決辦法這里就不細致說了,通常是相關的頭文件未包含。
解決辦法
指定原因就好辦了,既然知道是缺少了函數的喊昌具體實現,那麼就給它這個函數的實現就好了。比如上面的例子,是因為缺失了dlopen、dlsym、dlerror、dlclose這些函數的實現,這幾個函數是用於載入動態鏈接庫的,編譯的時候需要添加-ldl來使用dl庫(這是靜態庫,在系統目錄下/usr/lib/i386-linux-gnu/libdl.a、/usr/lib/x86_64-linux-gnu/libdl.a)。
但是看上面編譯的時候是有添加-ldl選項的,那麼為什麼不行呢?
gcc 依賴順序問題
這個主要的原因是gcc編譯的時候,各個文件依賴順序的問題。
在gcc編譯的時候,如果文件a依賴於文件b,那麼編譯的時候必須把a放前面,b放後面。
例如:在main.c中使用了pthread庫相關函數,那麼編譯的時候必須是main.c在前,-lpthread在後。gcc main.c -lpthread -o a.out。
上面拆滲逗出現問題的原因就是引入庫的順序在前面了,將其放置在後面即可了。
g++ -o spider bloomfilter.o confparser.o crc32.o dso.o hashs.o md5.o qstring.o sha1.o socket.o spider.o threads.o url.o -rdynamic -lpthread -levent -lcrypt -ldl
❸ 什麼是交叉編譯,為什麼要使用交叉編譯
交叉編譯的概念(來自網路):
簡單地說,就是在一個平台上生成另一個平台上的可執行代碼。同一個體系結構可以運行不同的操作系統;同樣,同一個操作系統也可以在不同的體系結構上運行。舉例來說,我們常說的x86 Linux平台實際上是Intel x86體系結構和Linux for x86操作系統的統稱;而x86 WinNT平台實際上是Intel x86體系結構和Windows NT for x86操作系統的簡稱。
舉個例子:
我們在Linux系統比如Ubuntu上編寫的C程序完全可以拿到Windows系統上正常運行。
❹ 什麼是交叉編譯技術,並簡述在嵌入式系統中採用該技術的原因
很簡單,交叉編譯就是在宿主機上編譯能在目標板上運行的程序,之所以用交叉編譯,就是因為很多目標機的功能不是很強大,例如沒有足夠的內存,CPU也不行。所以就要藉助宿主機來做好它所需要是東東,然後目標機用
❺ 什麼是交叉編譯,為什麼要採用交叉編譯
在一個平台架構上,編譯另一個平台架構的可執行代碼,就是交叉編譯。
例如在x86架構的PC上編譯arm嵌入式設備的可執行程序。
交叉編譯是不得不用,
首先在目標設備的系統還沒引導起來的時候,編譯目標平台的引導程序,顯然只能交叉編譯。
還有因為目標設備往往能力太低,沒法安裝編譯器,或者勉強安裝了,也慢得像蝸牛。
❻ ubuntu下進行嵌入式C語言開發時,什麼叫交叉編譯為什麼要交叉編譯
交易編譯就是將文件編譯成目標機可執行的文件。
比如說:你在PC機上寫一個helloword,怎麼讓它到開發板上運行,開發板上的指令跟PC機不到,就需要用到交叉編譯工具,編譯成開發板上能識別的指令。
❼ 嵌入式系統開發為什麼要採用交叉編譯的方式
由於嵌入式系統資源匱乏,一般不能像PC一樣安裝本地編譯器和調試器,不能在本地編寫、編譯和調試自身運行的程序,而需藉助其它系統如PC來完成這些工作,這樣的系統通常被稱為宿主機。宿主機通常是Linux系統,並安裝交叉編譯器、調試器等工具;宿主機也可以是Windows系統,安裝嵌入式Linux集成開發環境。在宿主機上編寫和編譯代碼,通過串口、網口或者硬體調試器將程序下載到目標系統裡面運行。所謂的交叉編譯,就是在宿主機平台上使用某種特定的交叉編譯器,為某種與宿主機不同平台的目標系統編譯程序,得到的程序在目標系統上運行而非在宿主機本地運行。這里的平台包含兩層含義:一是核心處理器的架構,二是所運行的系統,這樣,交叉編譯有3種情形:(1)目標系統與宿主機處理器相同,運行不同的系統;(2)目標系統與宿主機處理器不同,運行相同的系統;(3)目標系統與宿主機處理器不同,運行不同的系統。實際上,在PC機上進行非Linux的嵌入式開發,哪怕使用IDE集成環境如Keil、ADS、Realview,都是交叉編譯和調試的過程,只是IDE工具隱藏了細節,沒有明確提出這個概念而已。
❽ 為什麼要用交叉編譯器
交叉編譯,簡單地說,就是在一個平台上生成另一個平台上的可執行代碼。這里需要注意的是所謂平台,實際上包含兩個概念:體系結構(Architecture)、操作系統(Operating System)。同一個體系結構可以運行不同的操作系統;同樣,同一個操作系統也可以在不同的體系結構上運行。舉例來說,我們常說的x86 Linux平台實際上是Intel x86體系結構和Linux for x86操作系統的統稱;而x86 WinNT平台實際上是Intel x86體系結構和Windows NT for x86操作系統的簡稱。
有時是因為目的平台上不允許或不能夠安裝我們所需要的編譯器,而我們又需要這個編譯器的某些特徵;有時是因為目的平台上的資源貧乏,無法運行我們所需要編譯器;有時又是因為目的平台還沒有建立,連操作系統都沒有,根本談不上運行什麼編譯器。
綜上,在嵌入式開發的時候我們就要使用交叉編譯器。