2010-01-19 21 views
6

我知道Linux提供了ac庫,它實現了ISO C函數和系統調用函數,並且這個庫在開發C時可以與之鏈接。但是,不同的C編譯器不一定產生可鏈接的代碼(例如,填充函數參數中使用的數據結構與另一個不同)。當我可以使用任何編譯器來編譯我的C時,內置的c庫是如何連接的?對於靜態鏈接和動態鏈接,這個故事有什麼不同?在Windows和Linux下如何鏈接到OS C庫?

另一方面,在Windows下,每個編譯器都提供了自己的標準庫,它解決了部分問題,但系統調用仍在一組DLL中。 C應用程序如何成功鏈接到這些DLL?怎麼樣不同的語言? (相同的DLL可以被pre.Net Visual Basic等使用)

回答

4

每個平臺都有一些「調用約定」,爲了能夠正確地與操作系統對話,每個C實現必須遵守。例如,對於Windows,所有基於OS的功能必須使用stdcall約定來調用,而不是默認的C約定cdecl

在Linux中,由於標準C庫(和內核)是使用GCC編譯的,因此任何其他Linux編譯器都必須確保它們的調用約定與GCC使用的編譯約定兼容。

0

標準。你會注意到,stdlib的東西在原始值和數組上運行 - 而且這些東西的標準對於如何完成事情非常明確。

+1

一些ANSI C API在結構上運行,這對結構很敏感。 – 2010-01-19 01:01:03

3

編譯器確實附帶了標準庫的實現。只是在Linux下,假定任何編譯器都遵循與編譯該庫的GCC版本相同的約定。

由於互操作性,它可能比您想象的要容易。已經建立了調用約定,即使該函數沒有使用相同的軟件進行編譯,編譯器也可以生成對函數的有效調用。

就結構和填充而言,您會注意到大多數框架都使用不透明類型,即指向結構的指針。通常,結構的佈局甚至不能爲客戶提供。因此,他們從不使用實際的數據,只使用指向數據的指針,這會清除填充問題。