假設你使用C11,而你需要使用一個用C17撰寫的庫(靜態或動態)。你可以把庫編譯成物件檔案,然后把它們與你的程式鏈接起來嗎?我的意思是,物件檔案只是可執行檔案(是機器碼,或二進制?),只是你需要在它們可執行之前鏈接它們。我剛才寫的東西有什么瘋狂的地方嗎?
順便說一下,一個沒有任何依賴關系的物件檔案是可執行的嗎?
uj5u.com熱心網友回復: 為了使一個例程能夠呼叫另一個例程,它們需要以一種兼容的方式傳遞和接收引數。計算平臺通常有一個應用二進制介面(ABI),說明引數的傳遞方式。用C、C 、FORTRAN、PL/I或其他語言撰寫的例程只要使用相同的ABI,就可以相互呼叫。只要使用相同的 ABI,用不同的 C 標準編譯的例程就可以相互呼叫。
除了傳遞引數之外,還有一些兼容性問題。某一版本的庫可能有一些需要指定長度的功能。下一個版本可能需要指定長度和寬度,或者它可能要求長度,而寬度則是可選的。為一個版本的庫撰寫的程式可能無法使用另一個版本,因為它沒有傳遞庫所要求的引數,即使它傳遞引數的方式符合 ABI 的規定。
如果你有一個庫的源代碼和你自己的程式的源代碼,并且你使用同一個編譯器來編譯它們,只是一個使用 C 2017/2018 開關,另一個使用 C 2011 開關,如果你正確呼叫庫的例程,它們可以一起作業。
物件檔案通常是不可執行的,因為它們的格式與可執行檔案不同。有不同的物件格式,就理論上可能的情況而言,如果沒有實際的實踐,有人可以設計一種物件檔案格式,如果它不包含任何依賴關系,那么它就是可執行的,或者可以設計一個程式加載器,讀取物件檔案格式并加載它進行執行,同樣如果它沒有依賴關系。在這方面,雖然你可以通過讓程式加載器編譯、鏈接和加載它來執行一個源檔案。
標籤:
