【问题标题】:General C++ Linux-to-Windows porting questions一般 C++ Linux 到 Windows 移植问题
【发布时间】:2011-05-27 11:29:16
【问题描述】:

背景:基于网络的服务(tcp+udp,而不是 http)存在即将公开发布的C++ linux 客户端 API。此客户端 API 使用普通的 tcp 套接字、udp 套接字、C++ 命名空间和部分 stl,如 std::mapstd::vector,并将作为一组头文件和 .a.lib 文件发布以链接。

问题:刚刚开始研究如何将此 C++ 客户端 API 移植到 Windows。在 Windows 下使用 gcc/g++ 有意义吗?我的第一个倾向是这行不通,因为 Windows 上的开发人员通常使用 Microsoft Visual Studio 套件,并且他们无法链接到 gcc 生成的库。这是一个正确的假设,还是 gcc 提供了一些漂亮的开关来生成 Microsoft 编译器和 Microsoft 链接器兼容的输出文件?

【问题讨论】:

  • 为了火上浇油,我现在正在阅读 MinGW,看看这是否能满足我们的需要。 :) 公司不想分发源代码。只是头文件和 .lib 或 .dll 文件,他们的客户会链接到这些文件。
  • 使用 ASIO 重写所有内容,然后您不会遇到任何关于 n/w 部分在 Windows 上可移植的问题。尝试使用 Boost FileSystem、Threads 和 Interprocess。不要直接使用 posix 和 win32 api,除非真的有必要。
  • 我支持这个。最好移植到跨平台的东西(Qt 是另一个不错的选择),而不是从一个系统移植到另一个系统。不仅当您需要将其移植到另一个平台时它可能很有用,而且通常比处理依赖于平台的 API“功能”更容易。

标签: c++ windows visual-studio g++ porting


【解决方案1】:

我建议制定公共 API 标准 C,因为 C++ 库甚至不能在 Windows 上的不同编译器之间移植。如果需要 C++,请在 C API 之上构建一个小型 C++ 包装器,并将包装器源代码与您的库一起分发。

如果您想要一个纯 C++ API,如果您不想为每个编译器构建一个版本(或仅分发 Visual C++ 库),则可以分发源代码。取决于分发源是否可以接受...

【讨论】:

  • 也就是说,在某些情况下,Windows 上的 C++ ABI 可以被视为事实上的标准。事实上,在 Windows 上,确保使用正确的编译器有时比使用正确的 libc 更容易。
【解决方案2】:

只要您使用的编译器生成真正的 .dll 或 .lib 文件,在 Windows 中将它们与标准链接器链接应该不会有问题。但是,只有非托管开发(即经典 Win32 API 开发)或 C++/CLI 才能链接到这些 .dll。如果您编译为 .dll(不是 .lib),您可以使用 P/Invoke 语法从托管上下文(C#、VB.NET 等)中定位此程序集,但如果所有你正在做的是标准的套接字读/写操作,你最好在 .NET 中编写一个完全托管的实现。

归根结底,这取决于您想要定位哪些受众:对于经典 Win32,您没问题。对于托管目标(任何 .NET,除了 C++/CLI),最好用 C# 或 VB.NET 编写托管实现。

【讨论】:

    【解决方案3】:

    你为什么不直接创建一个 dll 并使用 GetProcAddress 和函数指针创建一个头文件?

    然后您可以在 Windows 上使用 msys 使用 MinGW (g++/gcc) 编译您的 API。 您唯一需要做的就是添加一些 Windows 代码,例如网络头文件和 wsastartup,链接到 libwsock32。

    此外,将代码移植到 VC++ 应该不是问题,它只需要一个项目和一些用于 Windows 特定代码的 ifdef。

    【讨论】:

    • GetProcAddress 如何与 C++ API 一起工作?我认为它只适用于 C 链接函数。
    • 您需要找到损坏的函数名称并将其放入 GetProcAddress。例如,C 函数 xy 具有 GetProcAddress(Hmodule "xy") 而 C++ 函数具有从 xy 到 "_xy@4" 的命名。有一个工具可以查看所有导出的函数名称。
    【解决方案4】:

    这是一个正确的假设,还是 gcc 提供了一些漂亮的开关来生成 Microsoft 编译器和 Microsoft 链接器兼容的输出文件?

    对于 C++ 编译文件,这是一个正确的假设。我看过一些关于如何将其添加到 GCC 的对话,结论是这是可能的,但需要大量工作。

    但是,对于 C 库,情况远非如此。那些应该更便携。一种可能对您来说很可行的选择是将您作为预编译代码分发的所有内容转换为 C,然后将需要成为 C++ 的内容放入用户编译的头文件中。

    【讨论】:

      【解决方案5】:

      问题在于 C++ 中没有名称修改标准,即使有,链接来自不同编译器的 C++ 代码也会有问题。这实际上也是 Linux 上的一个问题,除了那里的大多数人使用相同的编译器。

      使用 MinGW g++ 生成的库(从 http://tdragon.net/recentgcc 获取,而不是 MinGW SF 页面)与 Microsoft 代码兼容,但您需要提供 C 接口。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-14
        • 1970-01-01
        相关资源
        最近更新 更多