【发布时间】:2015-10-15 14:37:37
【问题描述】:
我有 2 套 C++ 文件,一套我只有来自 GCC 的 .o 文件但没有源代码,而另一套在 Microsoft Visual Studio 2015 中我有完整的源代码 - 这一套包括各种 VS Windows SDK 等库。对于部署,我希望只有一个 EXE(没有 DLL),所以我想将 .o 文件链接到 Microsoft Visual Studio 生成的 .obj 文件。 .o 格式似乎与 .obj 格式不兼容,两者都不能转换为另一种格式,而且似乎没有链接器能够将这两种类型的文件链接在一起以生成 1 个单独的 EXE。因此,我唯一的选择是将 Microsoft VS 下的文件集编译成 .o 格式。我尝试使用 GCC,但即使对 Microsoft 库源代码进行了相当多的修改,GCC 仍然无法编译 - GCC 编译器拒绝了很多 C++ 模板。这对我来说太难弄清楚如何修改了。
(编辑:上面的陈述似乎不完全正确,我之前错过了这个,Stack Overflow 向我建议,.o 文件和 .obj 文件可以在它们之间转换,虽然我还没有测试工具,并且需要更多的研究来确定这种方法的可靠性:Converting C++ object file from linux .o to Windows .obj。我相信 Windows 中来自 GCC 的 .o 文件与它在 Linux 中生成的文件相同。此外,我之前并不清楚,尽管这些文件是 C++,两个集合之间的相互通信,VS 集合和非 VS 集合,只需要在 C 代码中完成,即 .obj 将与 C++ 中的 .obj 文件通信,但仅使用 C 调用与 .o 文件通信. 尽管如此,鉴于这种方法似乎没有被广泛使用,我仍然更喜欢使用 GCC 编译 VS 源文件,因为只要我了解源文件所需的修改,我可以确信最终结果是可靠的。)
我查看了 Clang 以编译为 .o,但 Clang 网站似乎表明它也无法编译所有 Microsoft Windows 库: http://llvm.org/docs/GettingStartedVS.html
我也研究了英特尔 C++ 编译器,它可以编译 Microsoft 库,但我不知道如何让它在 Windows 下输出 .o 而不是 .obj。
是否有关于如何修改 Microsoft 库(包含在 VS2015 中)以在 GCC/Clang 下编译的任何指南?我在网上找到的最接近的是:http://www.transmissionzero.co.uk/computing/win32-apps-with-mingw/,我在 MinGW 上进行了测试,但它使用了 MinGW 自己的一组(修改过的?)Windows 库,排除了所有 ATL 文件。
(编辑:在探索了更多之后,不是 100% 肯定,但非常确信 GCC 可能无法编译 MS VS 库,可能只需要等待更高版本的 Clang。语法问题可能是已修复,例如将 i64 后缀更改为 LL,摆脱函数声明中的 throw(...) 等,但 __ptr32、__ptr64、__vectorcall 之类的内容在 GCC 中丢失,不确定是否可以直接删除,如果可能的话,像 __getcallerseflags 这样的事情似乎很可能不是简单的解决方法。在这里粘贴我的 GCC 命令行开关以防有人想尝试:-std="gnu++14" -nostdinc -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 .... -我包括 M S VS 文件夹)
【问题讨论】:
-
gcc编译器用于编译 C 代码,而不是 C++ 代码。要编译 C++ 代码,请使用g++编译器。生成可执行文件有两个不同的步骤。 1) 将所有源文件编译成目标 (.o) 文件。 2) 将目标文件以及任何需要的库文件链接到可执行文件中。在 g++ 中,(C++) 函数名称由参数和返回类型“修改”。 (这包括库中的函数名称。)因此两种目标文件输出不可互换。要获得更多帮助,请列出所有文件名以及创建方式 -
只有一个可执行文件,不依赖于 .dll 文件,链接步骤必须包含
-static参数。注意:对链接器使用“-static”参数会大大增加生成的可执行文件的大小,因为所有需要的库/.dll 函数都将包含在可执行文件中。 -
鉴于这一行(在问题中)“有 2 组 C++ 文件,一组我只有来自 GCC 的 .o 文件但没有源代码,而另一组在 Microsoft Visual Studio 2015我有完整的源代码-" 1) 你没有'2 套 C++ 文件' 2) 你有一套 C 目标文件 3) 一套 C++ 源文件。特别重要的是 C 目标文件不能(轻松)使用 C++ 库文件(但是,如果库是通过适当使用 '#ifdef cplusplus extern "C" ... #endif' 序列编译的彼此
标签: c++ c gcc clang visual-studio-2015