【问题标题】:How to compile C Linux libraries for use in Windows?如何编译 C Linux 库以在 Windows 中使用?
【发布时间】:2020-07-04 15:27:09
【问题描述】:

我有一个在 linux 上编写的 C 程序,我希望能够在 window 上运行和开发。该程序对posix/linux库有一些外部依赖,所以我猜我也需要在windows下编译这些库。我对 linux 工作流程很陌生,也没有 C 和编译器方面的专家。我知道 cygwin 和/或 msys2 和/或 mingw-w64 之类的东西可能是我需要的,但我不确定如何让它以对我有意义的方式工作。

我的程序看起来像这样(仅显示相关部分),目前在我的 ubuntu linux VM 下运行:

// Build:
// gcc -o disc-identifier main.c `pkg-config --cflags --libs glib-2.0 libmirage libisofs-1`
//
// Run:
// disc-identifier test_image.nrg

#include <glib.h>
#include <mirage/mirage.h>

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <limits.h>

#include <libisofs.h>

...

int main (int argc, char **argv)
{
     ...
}

我的理想目标是能够将其作为一个 Visual Studio 项目添加到解决方案中,并能够从 Visual Studio 中链接所需的依赖项(和编译)。然后我希望它编译成一个可移植的 32 位 x86 应用程序(可能带有一些随附的 dll 文件),不超过几 MB。但据我了解,我首先需要使用的库(glib、libmirage、libisofs)的 Windows 兼容版本,这让我有点不知所措。

【问题讨论】:

  • 您的一个依赖项存在于 cygwin cygwin.com/packages/summary/libglib2.0-devel.html 下。最大的问题是程序的可移植性如何?如果你需要一个独立的 windows 程序,试试 mingw。
  • 是的,我的目标是开发一个无需安装任何附加软件即可运行的独立程序(尽管不反对用它打包一个相对较小的 dll)。 libmirage 还需要 glib 与一堆其他依赖项一起构建(这是使这变得如此困难的一部分)。从我读过的库中不确定从哪里开始 mingw 可能需要对源代码进行重大更改才能正确编译,我真的不想这样做。

标签: c linux visual-studio cygwin mingw-w64


【解决方案1】:

我真的不是跨平台开发专家,但我已经构建了一个跨平台游戏(使用 Irrlicht 制作),主要是在 Linux 上开发的。

您是否听说过或者可能已经使用 CMake 构建了您的项目? 如果没有,我真的邀请您检查CMake 是这个非常强大的工具。

无需输入详细信息,CMake 是一个跨平台开发工具,它可以处理许多事情并为您提供即用型构建解决方案,例如:Makefile 和 Visual Studio 解决方案文件。
只需进行少量设置,您就可以为已经准备好为您构建项目的 Visual Studio 生成一个.sln 文件(或需要额外的设置,例如路径或 DLL)。

如果我误解了您的问题或者我在技术上不够全面,请提前道歉。 如果您想让我扩展我的答案,请告诉我;)

【讨论】:

  • 我明白了,我正在寻找有关如何为我的用例使用 mingw-w64 和/或 cygwin(不太确定我需要哪一个)的具体细节,它正在构建 Windows 兼容3rd 方 linux 库的版本,用于基于 Windows 的开发流程。我不是想创建一个跨平台项目,而是更多地尝试在一个非常专注于 Windows 的程序中利用一些仅在 Windows 上的 linux 上可用的工具。在这里使用 linux 从来都不是我的目标,但 libmirage 是唯一支持我需要的功能的库。
【解决方案2】:

是的,您是对的 - 如果库不是“仅标头”,则您需要特定于平台的构建。但这现在真的很容易。为此,我可以推荐vcpkg。 它支持 msbuild 和 cmake 集成 - 非常好。

要安装例如 glib,你只需要在你的 vcpkg 文件夹中打开一个 cmd 并输入

vcpkg install glib

Visual Studio 很好地支持“msbuild”和“cmake”。另一种选择是直接在 Visual Studio 中通过“NuGet”添加依赖项。 如果您使用这些工具,则无需自己编译库。

但您需要检查的是您的所有库是否都支持 Windows。如果没有,您可以使用 Visual Studio 进行开发,并且需要使用“远程调试”进行调试。最简单的方法是使用 Windows Subsystem For Linux (WSL)。

【讨论】:

  • 好吧,这些库(libmirage 和 libisofs)并不真正支持开箱即用的 windows,并且从未考虑过 windows 的开发,并且在 nuget 上肯定不可用(否则我会使用它)。使用 WSL 的问题是我的程序只能在我不需要的子系统下运行。我需要一个可以在任何 Windows PC 上运行的独立可执行文件。
  • WSL 就像一个虚拟机(但没有虚拟机)。因此,您需要一个本机 Windows 应用程序。库本身不需要太接近 Linux 或 Windows - 所以你可以尝试移植它们。我似乎包含了例如 fcntl.h 。这个头文件也存在于 Windows 中 - 但内容不同......此外,您可以替换您的库,也许已经有一些支持多个平台的东西。
  • 如果你能找到另一个库,它支持 libmirage 所支持的所有磁盘映像格式,那么我就是客人(相信我,我已经看过了)。我正在寻求有关如何将这个库从本质上移植到 Windows 的建议(无需对其进行重大更改)。使用 WSL 并不比我现有的运行代码的 Ubuntu 虚拟机有用。
猜你喜欢
  • 2021-07-16
  • 2016-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-01
  • 1970-01-01
相关资源
最近更新 更多