为windows API提供Rust绑定的windows crate被分成几个内部crate,其中一个是windows-target。这个创建也被分成几个内部的箱子,这些箱子是根据目标平台加载的。
这些平台相关的crate似乎没有做太多的事情:它们只是将cargo:rustc-link-search=native={LIB_DIR}
传递给编译器。
现在看看这些LIB_DIR
目录,它们包含一个已经编译的静态库,每个平台一个。例子:windows.0.48.0。lib文件。
我找不到关于这个的任何文档,但我想这些静态库是从baseline
目录中找到的C源文件编译的,其中包含…c语言中Windows API函数声明的重复,这很有趣。
Rust绑定本身是在别处写的,比如这里(GDI绑定)。
问题:这些编译的C静态库似乎是Windows中已有API的复制,那么为什么它们是必要的呢?
我通过直接询问官方的windows crate维护者得到了回应:
虽然GNU和MSVC工具链经常提供一些导入库来支持c++开发,但这些库文件通常是不完整的,缺失的,或者是完全错误的。这可能导致很难诊断的链接器错误。
windows-targets
crate确保windows
和windows-sys
crate定义的所有函数都可以链接,而不依赖于工具链分发的隐式库文件。
感兴趣的人可以在这里看到更多的细节。