【问题标题】:JSON-C build on Windows Platform基于 Windows 平台的 JSON-C 构建
【发布时间】:2020-06-05 05:38:00
【问题描述】:

免责声明:请仔细阅读问题,这个问题有一个转折,所以请阅读到最后。

所以JSON-C 是使用C 编程在JSON 上工作的非常流行的库之一。当前工作的基本说明,此处构建的任何代码都是针对多平台的。目前支持 Linux 和 Windows 的平台,我对 Windows 相关的 JSON-C 部分有一些小问题。

我正在使用 Cygwin 进行 Windows 开发,当我按照 GitHub 页面上提供的说明编译 JSON-C 代码时,使用 CMAKE 效果非常好,并且构建系统能够为 Windows 生成 DLL。但是,如果您使用过 Cygwin,那么您必须知道使用 Cygwin 构建的任何内容都将依赖于它的运行时环境 (cygwin1.dll) (Why does GCC-Windows depend on cygwin?),并且它不会是一个可以移动的独立 DLL围绕具有相同架构的不同系统。因此,如果我的项目是在 Windows 平台上构建的,那么由于对 Cygwin 的依赖,我必须随身携带 Cygwin Run-Time Env。或者我必须确保在目标系统上安装了 Cygwin 才能顺利执行。我不希望我的项目有这种依赖,它会破坏用户体验。

所以我想在这里得到什么帮助,有没有办法独立于 Cygwin(运行时环境)构建 JSON-C?

注意:我已经知道,如果使用 Cygwin 希望为 Windows 创建这样一个独立的 DLL,那么可以使用编译器的几个参数和一些放在函数前面的附加宏来完成此处所述的声明Creating a DLL in GCC or Cygwin?
但我在 Windows 的源代码 JSON-C 中看不到这种支持。所以我只是想知道 JSON-C 开发团队是否通过构建系统保留了一些配置,那么我很想知道那部分。

PS:由于我的其他开发,我还没有涉足 JSON-C 构建系统,所以如果那里的任何人(我心爱的社区)对此有任何了解,请分享,那就是太棒了。

编辑
忘了提及我正在使用的版本:p json-c-0.13.1-20180305

【问题讨论】:

    标签: windows build-system json-c


    【解决方案1】:

    我能够在 MSYS2 下使用 MinGW-w64 构建 JSON-C 0.14-20200419(来自 https://github.com/json-c/json-c) - 静态和共享 - 使用这些说明(根据需要替换 /usr/local):

    INSTALLPREFIX=/usr/local
    mkdir -p build_static build_shared &&
     cmake.exe -Wno-dev -GNinja -DCMAKE_INSTALL_PREFIX:PATH=$INSTALLPREFIX -DCMAKE_BUILD_TYPE:STRING=Release -DBUILD_SHARED_LIBS:BOOL=OFF -DBUILD_TESTING:BOOL=OFF -S. -Bbuild_static &&
     cmake.exe -Wno-dev -GNinja -DCMAKE_INSTALL_PREFIX:PATH=$INSTALLPREFIX -DCMAKE_BUILD_TYPE:STRING=Release -DBUILD_SHARED_LIBS:BOOL=ON -DBUILD_TESTING:BOOL=OFF -S. -Bbuild_shared &&
     ninja -Cbuild_static install/strip &&
     ninja -Cbuild_shared install/strip &&
     echo Success
    

    如果您没有忍者,您也可以使用-G"MSYS Makefiles" 并使用make 而不是ninja

    请注意,MinGW-w64 与 Cygwin 的不同之处在于它编译为本机 Windows 二进制文件,而不依赖于兼容层(如 Cygwin 的 cygwin1.dll)。以下屏幕截图说明了这一点:

    【讨论】:

    • 我也可以使用 Cygwin 构建 JSON-C,但问题是:它与 Cygwin 的运行时环境相结合,我想删除它并构建完全独立的 JSON-C 库。您应该使用Dependency Walker 检查您构建的 Lib,以检查它是独立的还是在运行时仍需要 MinGW Env。
    • 看看这个问题:Compile a DLL in C/C++, then call it from another program,你会更清楚我想要达到的目标。
    • @Novice 我不是在谈论 Cygwin。 MYS2+MinGW-w64 是一个不同的平台,可以生成不依赖额外兼容层(如 Cygwin 的 cygwin1.dll)的原生 Windows DLL 和 EXE 文件。
    • 是的,同意,但我的问题围绕着 Cygwin,所以这个答案完全无关紧要。正如我所提到的,如果可以通过 MinGW 实现 Lib 的完全独立,那么我可以考虑一下,但为此,您必须使用依赖检查器检查您构建的(通过 MinGW)JSON-C Lib 并在此处发布结果。 (如果使用 MinGW,可以构建一个独立的 JSON-C Lib。)
    • @ramtech 抱歉,忘记删除这些。我有一些自制脚本用于我正在开发的winlibs.com 环境的构建配方中。 ~/buildstatus.sh 只显示构建过程的哪个步骤正在进行中。我从上面的答案中删除了它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 2015-05-20
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多