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

使用GCC或Clang编译Microsoft Visual Studio Windows库 我有2组C++文件,其中一组只有GCC中的.O文件,但没有源代码,而另一组在微软Visual Studio 2015中,我有完整的源代码-这个集合包括各种VS库,如Windows SDK。对于部署,我希望只有一个EXE(没有DLL),因此我希望将.o文件链接到Microsoft Visual Studio生成的.obj文件。.o格式似乎与.obj格式不兼容,两种格式都不能转换为另一种格式,而且似乎没有链接器能够将这两种类型的文件链接在一起以生成一个EXE。因此,我唯一的选择是将Microsoft VS下的文件集编译为.o格式。我尝试使用GCC,但即使在对微软库源代码进行了一些修改之后,GCC仍然无法编译——GCC编译器拒绝了很多C++模板。这对我来说太难了,我想不出如何修改,c++,c,gcc,clang,visual-studio-2015,C++,C,Gcc,Clang,Visual Studio 2015,(编辑:上面的陈述似乎不完全正确,我之前错过了这一点,堆栈溢出向我建议,.o文件和.obj文件可以在它们之间转换,尽管我还没有测试这些工具,并且需要更多的研究来确定这种方法的可靠性:。我相信Windows中GCC的.o文件与它使用的文件相同在Linux中,Nealts也很清楚,虽然文件是C++,但是2组、VS组和非VS组之间的通信只需要在C代码中完成,即Objc将与C++中的Objo文件通信,但只与C调用通信。uld仍然喜欢使用GCC编译VS源文件,因为只要我了解源文件所需的修改,我就可以确信最

(编辑:上面的陈述似乎不完全正确,我之前错过了这一点,堆栈溢出向我建议,.o文件和.obj文件可以在它们之间转换,尽管我还没有测试这些工具,并且需要更多的研究来确定这种方法的可靠性:。我相信Windows中GCC的.o文件与它使用的文件相同在Linux中,Nealts也很清楚,虽然文件是C++,但是2组、VS组和非VS组之间的通信只需要在C代码中完成,即Objc将与C++中的Objo文件通信,但只与C调用通信。uld仍然喜欢使用GCC编译VS源文件,因为只要我了解源文件所需的修改,我就可以确信最终结果是可靠的。)

我查看了要编译到.o的Clang,但Clang网站似乎表明它也无法编译所有Microsoft Windows库:

我也研究了英特尔C++编译器,它可以编译微软库,但我无法确定如何使它输出。o代替.windows下的.Obj.< /P> 关于如何修改要在GCC/Clang下编译的Microsoft库(包括在VS2015中),是否有任何指南?我在网上找到的最接近的是:,我测试了它在MinGW上的工作,但它使用MinGW自己的一组(修改的?)Windows库,不包括所有ATL文件


(编辑:在进一步研究之后,不是100%确定,但非常确信GCC可能无法编译MS VS库,可能需要等待更高版本的Clang。语法问题可以解决,例如将i64后缀更改为LL,摆脱throw(…)在函数声明中,等等,但是像uu ptr32、u ptr64、u vectorcall之类的东西,在GCC中丢失了,不确定是否可以只进行虚拟化,像uu getcallerseflags之类的东西看起来很可能不是简单的解决方法,如果可能的话。在这里粘贴我的GCC命令行开关,以防有人想尝试:-std=“gnu++14”(D)D)D(D)D(D)C(D)D(D)D(D)D(D)D(D)P(P)P(PTR3 3)2(D)D(D)D(D)D(矢量调用)D(D)D(U)D(U)C)D(U)D)D(U)D(U)D)D(D)D(D)D(D)D)D(D)D)D(D)D(D)D)D(D)D)D(D)D)D)D(D)D)D(D)D)D)D(D)D)D)D(D)D)D)D(D)D)D)D)D(D)D)D)D(D)D)D)D(D)D)D(D)D)D)D)D(D)D)D(D)D)D)D)D(D)D)D)D(D)D)D)D(“长=长”-D_WINSOCK_已弃用_无警告…-我包括MS VS文件夹)

> P>我担心你运气不好。你看到每个编译器都会在C++中对方法名称进行不同的修改。在对象代码中,一个类中的方法必须用参数、返回类型和成员资格来编码。我认为最好的方法是通过GCC建立一个DLL,然后在Windows上使用VC.CLAN仍然是一个头痛的问题。<代码> GCCC <编译程序是编译C代码而不是C++代码。编译C++代码使用的是代码> G++//>编译器。有两个不同的步骤来生成可执行文件。1)将所有源文件编译成Objo(.O)文件。2) 将对象文件以及任何需要的库文件链接到可执行文件中。在g++中,(C++)函数名由参数和返回类型“修改”。(这包括库中的函数名。)因此这两种对象文件输出是不可互换的。要获得更多帮助,请列出所有文件名以及createdto如何仅具有一个可执行文件,而不依赖.dll文件,链接步骤必须包含
-static
参数。注意:对链接器使用“-static”参数将大大增加生成的可执行文件的大小,因为所有需要的库/.dll函数都将包含在可执行文件中。给定这一行(在问题中)“有2组C++文件,一组只有GCC的.O文件,但没有源代码,而微软Visual Studio 2015中的另一组,我有完整的源代码。“1”你没有“2组C++文件”2)你有一组C对象文件3)一组C++源文件。特别重要的是,C对象文件不能(容易)使用C++库文件(但是,如果库是使用适当的使用‘yifIFDEF cPLUS PLUS外加”C编译的。我可以把DLL方法作为一个回退计划,但是在我放弃1个单个EXE文件之前,想进一步探索一下。嗯,写一个包装器在C中,然后用C方法来显示C++代码。最后你会看到你的.O文件,还有一个是纯C.。C方法名称在所有编译器中都以同样的方式被破坏……如何在那里混合OBJ和O文件如果不能天真地完成,你可能必须寻找一个工具。谢谢。我编辑了我最初的问题,因为我后来才发现有这样一个工具存在。但这似乎并不常见。我将对它进行测试,并可能对它进行一点研究