使用GCC或Clang编译Microsoft Visual Studio Windows库

Compile Microsoft Visual Studio Windows libraries using GCC or Clang

本文关键字:Visual Studio Windows Microsoft 编译 GCC Clang 使用      更新时间:2023-10-16

我有2组c++文件,其中一组我只有来自GCC的。o文件,但没有源代码,而另一组在Microsoft Visual Studio 2015中,我有完整的源代码-这一组包括各种VS库,如Windows SDK。对于部署,我宁愿只有一个单一的EXE(没有dll),所以我想将。o文件链接到由Microsoft Visual Studio生成的。obj文件。.o格式似乎与。obj格式不兼容,两者都不能转换为另一种格式,并且没有链接器似乎能够将这两种类型的文件链接在一起以产生一个单一的EXE。因此,我唯一的选择是将microsoftvs下的文件集编译成。o格式。我尝试使用GCC,但即使在对微软库源代码进行了相当多的修改之后,GCC仍然无法编译——有很多c++模板被GCC编译器拒绝。这对我来说太难了,我不知道如何修改。

(编辑:上面的声明似乎不完全正确,我之前错过了这一点,Stack Overflow向我建议,.o文件和。obj文件可以在它们之间转换,尽管我还没有测试出这些工具,并且需要更多的研究来确定这种方法的可靠性:将c++对象文件从linux .o转换为Windows .obj。我相信GCC在Windows中的.o文件与它在Linux中生成的文件是相同的。此外,我之前并不清楚,虽然文件是c++,但两个集合之间的相互通信,VS集和非VS集,只需要在C代码中完成,即。obj将与。obj文件在c++中通信,但只使用C调用与。o文件通信。尽管如此,鉴于这种方法似乎没有被广泛使用,我仍然更喜欢用GCC编译VS源文件,因为只要我了解源文件所需的修改,我就可以确信最终结果是可靠的。

我查看了Clang编译成。o,但是Clang网站似乎表明它也不能编译所有的Microsoft Windows库:http://llvm.org/docs/GettingStartedVS.html

我也研究了英特尔的c++编译器,它可以编译微软的库,但我不知道如何使它在Windows下输出。o而不是。obj。

是否有关于如何修改Microsoft库(包含在VS2015中)以在GCC/Clang下编译的指南?我在网上找到的最接近的是:http://www.transmissionzero.co.uk/computing/win32-apps-with-mingw/,我测试了它在MinGW上工作,但它使用MinGW自己的一组(修改?)排除所有ATL文件的Windows库。

(编辑:在探索了更多之后,不是100%确定,但相当确信GCC可能无法编译MS VS库,可能只需要等待Clang的更新版本。语法问题可以修复,例如将i64后缀更改为LL,在函数声明中摆脱throw(…)等,但是像__ptr32, __ptr64, __vectorcall这样的东西在GCC中丢失,不确定是否可以只是假的,而像__getcallerseflags这样的东西似乎很可能没有简单的解决方案,如果可能的话。-std="gnu++14" - nodinc -Wmissing-include-dirs -fpermissive -fms-extensions -D "__ptr64 =" -D "__ptr32 =" -D "__vectorcall = __fastcall" -D "__unaligned =" -D "__forceinline = inline" -D "__nullptr = nullptr" -D "__pragstr(X) = _Pragma(#X)" -D "__pragma(X) = __pragstr(X)"-D _M_AMD64 -D _M_X64 -D _WIN64 -D "_MSC_VER = 1400" -D "__int64 = long long" -D _WINSOCK_DEPRECATED_NO_WARNINGS .... . d

恐怕你运气不好。您可以看到,在c++中,每个编译器对方法名的修改都是不同的。在对象代码中,类中的方法必须用参数、返回类型和成员关系进行编码。我认为最好的方法是通过GCC构建一个DLL,然后在VS.使用它。Windows上的Clang仍然是一个令人头痛的问题。