如何准备在单个 Windows 环境中生成 .dll 和 unix .so 的构建作业?

Posted

技术标签:

【中文标题】如何准备在单个 Windows 环境中生成 .dll 和 unix .so 的构建作业?【英文标题】:How to prepare a build job that produces .dll and unix .so on single Windows environment? 【发布时间】:2013-05-14 09:40:59 【问题描述】:

如何创建一个 C++ 单一构建作业,生成在 Windows 上工作的 .dll 和在 Unix 上工作的 .so 准备工作?

假设我们的开发环境是基于Windows的。

【问题讨论】:

您的代码是否已经在 Linux 上编译,或者您是否正在寻找一种工具可以让您的 Windows 代码在 Linux 上运行而无需进行移植工作? 【参考方案1】:

在 Unix 或 Linux 上,您的共享库需要链接到像 /lib64/libc.so.6/lib64/ld-linux-x86-64.so.2 这样的系统库。如果这是您所要求的,则无法在 Windows 上链接这些(除非您在 Windows 上部署了 Linux 交叉编译工具链,如果存在的话)。您需要在目标操作系统上编译它。

【讨论】:

很好,我也想过虚拟机解决方案,但真的不知道这是什么大问题【参考方案2】:

我会给你一些简单的解决方案。请仅将其视为一个想法。我从来没有这样做过。但我认为从逻辑上讲这应该是可能的。

    在 Windows 环境中开始您的工作。 您必须使用预处理器指令编写支持 windows 和 Unix 的代码。 创建两个支持 windows 和 Unix 的 make 文件(make_win、make_uni)。实际上,您也可以在单个 make 文件中执行此操作。 在windows环境下安装Oraclevirtual box。 在虚拟机上安装fedora-18。 现在您可以通过 windows 和 Fedora 两种操作系统同时访问您的 make 文件(只需您可以使用两种操作系统访问相同的文件系统)。 使用 windows 运行 make_win,使用 fedora 运行 make_uni。

注意:您可以选择在Linux环境下工作,并且可以在上面安装virtual-box和windows top。

这些东西可以帮助你 http://geekery.amhill.net/2010/01/27/virtualbox-with-existing-windows-partition/ http://www.giannistsakiris.com/index.php/2008/04/09/virtualbox-access-windows-host-shared-folders-from-ubuntu-guest/

【讨论】:

【参考方案3】:

使用 minGW 并为 linux 和 windows 准备代码

http://www.mingw.org/

【讨论】:

我查看了由g++ --shared a.cpp -o a.so 生成的二进制 .so 文件,它包含例如“stdarg.h windef.h stddef.h winnt.h stdio.h”,所以这是一个重命名为的 .dll .so,我是对的? 我知道反之亦然,使用 linux 主机系统并使用 GCC + MinGw 交叉编译 windows。我不知道是否有可用于在 Windows 主机系统上交叉编译 linux .so 的工具链(我对此表示怀疑)。【参考方案4】:

可能是 Cygwin 环境允许一些交叉编译技巧:Cross compiling for linux from Cygwin

我自己没有对此进行测试,但可以想象一些构建过程会分开,例如MinGw 构建 Windows .dll 和 Cygwin 以及用于 .so 的交叉编译工具 ...

结果可能是(取决于您的实际用例)只需使用 VM 在 Linux/Unix 系统上编译并共享用于编译的纯源代码(例如,使用 CMake + GCC + MinGw [for Windows only] as统一的构建环境,甚至从linux系统交叉编译Windows .dll)更好地为您服务。

【讨论】:

【参考方案5】:

是的,CMake 可以做到这一点 :) 您需要培养编写体面的 cmake 规则的技能,但是当您掌握它时,您可以使用一个小的构建命令轻松地进行交叉构建。此外,我建议您将 Jenkins 与您的 CMake 一起使用,这可以与 CTest 和 CPack 链接,您将拥有一个很棒的开发地牢:)

【讨论】:

如果没有合适的 windows 下交叉编译器,即使 CMake 也无法为 linux 编译。您可以使用 CMake 创建在任何平台 linux 和 windows 上都能正常工作的构建环境。但这不是 OP 的问题,对吧? 我使用 CMake 和 gcc 在同一个机器上交叉构建 Windows 和 Linux 代码。【参考方案6】:

必须对源代码进行返工。另外如果使用MinGW,我们可以最大限度地减少返工。但是如果我们使用微软编译器,返工更多,必须使用单独的make文件。

【讨论】:

以上是关于如何准备在单个 Windows 环境中生成 .dll 和 unix .so 的构建作业?的主要内容,如果未能解决你的问题,请参考以下文章

如何比较多列,并在单个新列中生成值,在 Pandas 中使用 Apply 函数

如何在 1 个单个 div 中生成 *ngFor 循环项,而不是每个项目周围都有一个 div 容器

如何在多线程环境中生成 PreparedStatements?

在 pyCuda 内核中生成单个随机数

Sqoop Merge 工具在单个文件中生成输出

是否可以在单个 Eloquent 查询中生成 3 个嵌套层?