我最近遇到了一些問題,試圖在我的Mac上編譯一個依賴於另一個庫的開源庫,並得到了有關不兼容庫體系結構的一些錯誤。有人可以解釋爲特定架構編譯C程序的概念嗎?我已經看到-arch
編譯器標誌之前,並看到傳遞給它的值,如ppc
,i386
和x86_64
,我假設它映射到CPU「語言」,但我的理解停在那裏。如果一個程序使用特定的體系結構,那麼它加載的所有庫都需要在同一個體系結構中?我怎麼知道給定的程序/進程正在運行的架構?編譯具有特定體系結構的C程序
回答
有人可以解釋爲特定架構編譯C程序背後的概念嗎?
是的。這個想法是將C翻譯成一系列本地機器指令,將程序編碼爲二進制形式。這裏的「體系結構」的含義是「指令集體系結構」,指令是如何以二進制編碼的。例如,每個體系結構都有自己的編碼方式,用於添加兩個整數的指令。
編譯成機器指令的原因是它們運行非常快。
如果一個程序使用特定的體系結構,那麼它加載的所有庫都需要在同一個體系結構中?
是的。 (有例外,但很少見。)
如何判斷給定程序/進程正在運行的架構?
如果一個進程在你的硬件上運行,它是在原生架構,在Unix上,你可以通過運行命令uname -m
發現運行,雖然人類從讀者的uname -a
輸出可能會提供更多的信息。
如果你有一個可執行的二進制或一個共享庫(.so文件),則可以使用file
命令發現它的架構:
% file /lib/libm-2.10.2.so
/lib/libm-2.10.2.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
% file /bin/ls
/bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, stripped
你可以看到,這些二進制文件已編爲很老80386架構,儘管我的硬件是更現代的i686。 i686(Pentium Pro)向後兼容80386並運行80386二進制文件以及本機二進制文件。爲了使這種向後兼容成爲可能,英特爾遇到了很多麻煩和費用—,但他們幾乎在臺式機CPU上佔據了市場,所以這是值得的!
要爲CPU構建與本機不同的體系結構,您需要一個交叉編譯器,這意味着生成的代碼無法在您所坐的計算機上本機運行。 GCC可以做到這一點。找出構建程序的體系結構以查看文件命令。至少在基於Linux的系統中,一個32位x86程序需要32位x86庫來支持它。我想大多數操作系統都是一樣的。
這裏可能會引起混淆的一件事是,Mac平臺有他們所說的universal binary,這是一個存檔中的兩個二進制文件,一個用於intel,另一個用於ppc體系結構。您的電腦將自動決定運行哪一個。您可以(有時)在仿真模式下運行另一個架構的二進制文件,並且某些架構是其他架構的超集(即i386代碼通常運行在i486,i586,i686等),但大多數情況下只有代碼你可以運行你的處理器架構的代碼。
對於交叉編譯,不僅是程序,而且它使用的所有庫都需要與目標處理器兼容。有時這意味着安裝了第二個編譯器,有時候這只是爲編譯器提供了正確的額外模塊的問題。交叉編譯器爲gcc is actually a seperate executable, though it can sometimes be accessed via a command line switch。各種體系結構的gcc交叉編譯器很可能是單獨安裝。
ldd在這種情況下有幫助嗎?
- 1. 沒有可編譯的體系結構
- 2. 庫編譯爲體系結構x64,具有ARM架構錯誤
- 3. 沒有體系結構編譯iphone sdk
- 4. 編譯C++時體系結構x86_64的未定義符號
- 5. 編譯.C文件:體系結構x86_64的未定義符號
- 6. 體系結構x86_64的未定義符號:使用C++編譯
- 7. 爲iPhone 6編譯錯誤(沒有體系結構編譯)
- 8. C編譯器對體系結構的依賴關係
- 9. 在C中檢測特定進程的CPU體系結構#
- 10. 爲ARM體系結構編譯libcivil
- 11. CMake多體系結構編譯
- 12. 具有Web服務的.net應用程序的體系結構
- 13. 任意體系結構的可編譯目標編譯器
- 14. 針對具有ABI分割的特定體系結構的Gradle依賴關係
- 15. 用於VLIW體系結構的GCC編譯器基礎結構
- 16. 編譯C結構
- 17. 體系結構x86_64的未定義符號 - 編譯繼承類
- 18. gfortran編譯錯誤:體系結構x86_64的未定義符號
- 19. Caffe編譯失敗:體系結構x86_64的未定義符號?
- 20. j2objc編譯錯誤:未定義的符號體系結構arm64:
- 21. 如何確定我在GCC中編譯的體系結構?
- 22. 具有特殊要求的fronend體系結構
- 23. 體系結構特定標頭
- 24. 在OSX終端中編譯C++:體系結構x86_64的未定義符號
- 25. 體系結構特定結構的通用變量
- 26. 沒有體系結構編譯爲(ARCHS =,VALID_ARCHS = armv7 armv7s)
- 27. 升級到xcode 4錯誤沒有體系結構編譯爲
- 28. Xcode iOS6編譯錯誤:沒有體系結構
- 29. 使用頭文件編譯C++程序時出錯:體系結構x86_64的未定義符號
- 30. Qt SIGNAL的體系結構,具有子類特定的模板參數類型