『壹』 你好!看到你對於有關linux的回答我想問下你,就是關於用arm-linux-gcc命令編譯的C源程序。變為不能執...
首先你用arm-linux-gcc編譯的時候,編譯出來的是不能在PC機上運行的,並不是說它不是可執行文件
不論是gcc還是arm-linux-gcc,都是把c代碼轉換成機器碼,性質是一樣的,只不過,PC一般都是x86架構而arm-linux-gcc是編譯成arm架構的可執行程序
『貳』 linux運行與不同CPU體系架構的版本,其應用軟體能否兼容
當然你得有軟體的源代碼,然後得重新編譯一下才能用
代碼要是寫的特別規范而且沒用什麼某系統專有的東西的話,移植到windows都可以
不過也不保證所有的軟體都沒寫某個cpu架構專有的東西
還有像wine那樣的軟體就不太可能移植到別的架構了
『叄』 高級編程語言也要編譯成匯編語言,不同的cpu匯編語言不一樣,那會編譯成那種匯編語言呢
高級語言一般最終不是編譯成匯編語言而是機器語言,而像C#這類語言編譯後為公共語言,不是機器碼,運行時公共語言代碼由NET框架負責進一步即時翻譯即時執行為機器指令。只有C++這類語言編譯後為CPU可以直接執行的機器碼。
附圖是VS2019中C++語言的一段調試時的反匯編窗口,其中白字是C++源代碼,下面是對應的匯編碼,匯編行左列為內存地址,中間是對應的機器指令和數據(內存中的實際值),右側是對應的匯編碼。
比如,定義整數變數a並賦值1的語句,被編譯器編譯成C7 45 F8 01 00 00 00 這樣幾個位元組,其中C7為匯編碼中的MOV指令,可以操作16位寄存器和內存以及立即數,45 F8 是當前命名空間中變數地址,即變數a的地址(F845),而01 00 00 00 為32位寬度的數值1(內存排列順序是前低後高)。也就是說機器語言的指令格式為:指令代碼,地址,數據,當然根據不同指令,有時候地址和數據是不需要的。而右側 MOV dword ptr[a],1 是指令助記符,也就是匯編指令,而用匯編指令編寫的程序也是需要編譯成機器指令的。
指令C7對應的匯編碼及含義
『肆』 相同的cpu架構,在不同的操作系統下生成的程序為什麼不可以通用程序不是機器語言么針對硬體操作的阿
相同的CPU架構只是指程序運行的硬體是相同的,而軟體(操作系統、操作系統下生成的程序)是不一樣的,最後生成的針對硬體操作的機器語言也不一樣。生成的程序最後都要匯編成機器語言才能被運行,而機器語言在同一種架構下都可以用.但不能運行在不同架構的平台下。
『伍』 請問運行於不同CPU構架的linux,它們的軟體可以通用嗎
以上回答中jiangtao9999的比較靠譜兒。
是這樣:
1、Linux下的軟體幾乎都是c語言的;
2、如果你學過C語言,找找書應該有這樣一個概念:ANSI C,這個是一個C語言的標准,比如printf這個函數就屬於標准庫(也就是符合ANSI標準的)函數
3、假如你編寫了一個軟體,代碼中僅僅包含ANSI的庫函數,那麼沒有問題,只要是支持C語言的平台,都能正常運行,即:編寫了一個簡簡單單的helloworld到哪裡編譯運行都沒有問題。
【前提是:】編譯再運行,不編譯就運行是不可以的,比如printf函數在各種架構上的實現方式是不可能相同的,所以需要在arm的編譯器上再編譯一遍才可以。否則運行不了。
有的軟體平台可以不用編譯,直接運行,比如jiangtao9999說的java、Python什麼的,Java可以實現「一次編譯,滿哪運行」什麼的,而Python則是有了.py源代碼就可以無敵了,使用的時候不用你去執行編譯命令,直接執行即可。arm上實現這兩種語言都是很容易的——下載源代碼、編譯、安裝即可。
4、不同架構的Linux平台都要實現一個編譯器,這是很重要的,有了編譯器,才可以從源代碼安裝軟體。
5、使用非ANSI庫中的函數需要該Linux包含這個函數的實現,否則,編譯後的連接將不通過,比如一個軟體使用了GTK來實現圖形用戶界面,那麼就需要系統中包含了gtk的庫函數,這就叫依賴,安裝軟體,首先要解決依賴,依賴有時候解決起來很麻煩,所以軟體開發過程中盡量減少依賴,這樣方便安裝。
6、tar.gz這種格式的軟體包有可能是源代碼,有可能是可執行文件(這是因為那隻是一個壓縮包,內容是什麼不一定),這兩者不同。很多軟體以tar.gz格式發布源代碼,而qq的Linux版本屬於可執行文件,在幾乎所有Linux平台下面直接雙擊或者通過命令就可以使用。
7、如果你使用的是rpm包或者deb包或者是tar.gz文件包中可執行文件形式的軟體包,而不是tar.gz這種形式的源代碼,你需要使用相應的軟體包管理器安裝就行,
但這不意味著arm版本的deb和x86版本的deb文件是通用的,你能這樣用是因為所有的使用x86機器的軟體經過編譯或者交叉編譯(在arm平台上編譯x86平台上的軟體就叫交叉編譯)以後,運行於幾乎完全一樣的統一的平台上,實現軟體和系統的無縫對接,方便了用戶——一方面可以不用浪費編譯的時間,主要還是方便了那些不會編譯軟體的人。
8、我也正在學習Linux,所以很多地方不太對,這只是我現在的一些理解。jiangtao9999說的主要是和匯編有關,如果代碼的實現主要是在c語言水平,那麼就會由編譯器屏蔽掉指令集和寄存器什麼的。
9、要是在網路回答的答案能改改就好了,這樣錯誤就會少一點。
10、重新羅嗦一遍:
1在不重新編譯源代碼的情況下,x86下linux的軟體不可以運行於arm構架的Linux,即使運行也會奇卡。
2和在編譯是否時為X86的CPU構架優化了編譯無關。(把我問迷糊了,估計是無關)
3軟體在編譯時是否為X86的CPU構架而優化主要看作者了,資料可以參看http://www.gentoo.org/doc/zh_cn/gcc-optimization.xml
4和不同的安裝包格式有一定關系
5tar.gz格式的軟體包不能保證在不同架構的Linux都能運行
6在arm的linux安裝時解決依賴以後,乳溝編譯通過基本是沒什麼問題的
7不是所有源代碼在arm和x86下編譯一下就可以了,還需要做一些努力
8有源代碼可以對遇到的不通過的問題逐一解決,理論上可以實現所有軟體都能運行
9重新編譯過程中如果遇到依賴問題需要逐一解決
『陸』 誰知道為什麼c語言程序為何可以在不同CPU上運行,還有,如果一個操作系統如果使用匯編語言開發,除了
因為運行的並不是C語言的代碼,而是被編譯器編譯過的C語言代碼,只要編譯器設置正確,在不同的CPU上想完成相同的任務,C代碼是完全一樣的,只就是所謂的代碼移植,編譯好的C程序是不能移植的,但是相同的代碼可以在任何有編譯器的環境中編譯.
至於操作系統,用匯編寫的話,很難讓人理解,查錯,修改,升級都會比較麻煩,但是性能上,直接用匯編寫,如果你的技術夠高,肯定會比C的要好.
『柒』 同一程序在不同處理器上CPI一樣嗎
關於這個問題,相同的CPU架構只是指程序運行的硬體是相同的,而軟體(操作系統、操作系統下生成的程序)是不一樣的,最後生成的針對硬體操作的機器語言也不一樣。生成的程序最後都要匯編成機器語言才能被運行,而機器語言在同一種架構下都可以用.但不能運行在不同架構的平台下。
『捌』 為什麼同一款軟體在不同指令集的CPU上運行相同的結果操作系統和編譯器在其中起到了什麼作用
軟體是較高的層次,它告訴cpu具體的運算內容,cpu指令集是更底層的,它接受指令運算並輸出結果,就像不同廠家的電視機,雖然內部電路不一樣,但輸出的圖像時一樣的,
當然由於指令集不同運行效率等細節上還是有差別但不影響結果!
操作系統就是管理各軟體的,及管理軟體運行所需要的軟硬體資源,編譯器是應用程序(軟體)和操作系統的橋梁,操作系統通過編譯器制定軟體要干什麼,才能調用相關資源使其運行起來!
『玖』 假如市場上有兩種CPU架構,軟體公司如何設計軟體
如果你所說的這個軟體公司,只是做應用軟體的話,大可以不管這些。應用軟體在操作系統之上。就像現下用java、.net做的軟體就屬於這一類。用java開發的只要能跑java虛擬機的操作系統,都沒問題,因為java程序運行在java虛擬機上,不與操作系統直接打交道;.net程序運行在微軟的CLR上,只要是安裝有合適CLR的微軟操作系統,基本都可以運行。所以,做應用開發與CPU架構無關。
如果是做殺毒安全之類軟體,也關系不大,因為這類軟體基本都是調用操作系統API,有廠家提供的SDK包就行。SDK包里封裝了操作系統的相關技術調用,所以在使用時也可以不必擔心。
如果是做驅動程序之類的就比較麻煩了,這個一般每種CPU都有針對性地開發包。如果CPU架構不同,或許不能通用。
以上都是一般性的說法,如果你用匯編做,以上的三種無論如何都與CPU架構相關,做時選用匹配CPU的匯編編譯器版本就是了。
『拾』 cpu架構 系統 和可執行程序之間的關系
這個話題其實挺大的,也挺小的。
cpu架構,
目前通用的桌面平台就是x86架構,也就是通用的復雜指令集,而power、arm是簡單指令集。
相比較而言,復雜指令集提供的平台更小,畢竟規定更多。而簡單指令集,提供的平台很寬廣。
但,cpu的架構不能說好與壞,只是應用環境不同。
操作系統,
與cpu架構差不多,最早的unix一直應用在高端領域,關鍵就是穩定,但價格昂貴,維護費用高。
linux就是為了降低維護費用,並提供一個相對穩定的平台,而出現的衍生品。
windows平台,好處就是圖形化,操作簡單,應用多,而且廣。
如果像unix或linux那種,編輯個文檔,都需要開發個軟體,對於絕大部分人來說,太復雜了。