windows - 通过在 Linux 上引导,然后交叉编译,从源代码构建适用于 Windows 的 CMake

标签 windows cmake

CMake是一个构建系统,但官方项目提供的 Windows 二进制文件既没有代码签名,也没有用 PGP 签名。

因此,如果您像我一样不信任预构建的二进制文件,您可能会发现以下答案很有用。

我在为 Windows 构建 CMake 的过程中遇到了许多问题,因此下面的答案可能会让您省去一些试验和错误或通常重复一些步骤。

上次我检查 MinGW 发行版也没有签名,除此之外,与 Linux 上的 GCC 相比,它似乎相当缓慢。

最佳答案

注:revision 2解释 CMake 3.3.0 的步骤,以防您碰巧对旧版本的 CMake 感兴趣。

为了构建 CMake,我们需要某种工作的 CMake。 Catch 22,对,因为我们不能相信官方下载页面上提供的二进制文件。

该答案描述了如何使用从源代码引导的 Linux CMake 从 Linux 为 CMake 构建 Windows(32 位,即 x86)构建,以便引导 Windows。

构建 CMake v3.12.3对于 Windows,通过 Git 引导的 Linux CMake

存储库现在是 here .

我们的构建系统

就我而言,我选择 Ubuntu 18.04 作为引导 Windows CMake 的构建系统。

我假设元包 build-essential已经安装,如果没有继续安装它。它包含我们需要的大部分构建工具。

如果您没有 qt4-qmake安装后,您将在调用 ./bootstrap 时在输出的末尾得到以下几行.这对于第一步来说并不是致命的,显然与丢失 curses 的方式相同。图书馆是非致命的。

qmake: could not exec '/usr/lib/x86_64-linux-gnu/qt4/bin/qmake': No such file or directory
qmake: could not exec '/usr/lib/x86_64-linux-gnu/qt4/bin/qmake': No such file or directory

但是,对于 Windows 32 位的交叉编译将因这两行而失败。

安装先决条件

注意(再次):假设 build-essential已安装。所以我们要安装五个包及其依赖项:
  • mingw-w64 (需要作为目标 Windows 的交叉编译器)
  • git (需要从 Kitware 获取源代码)
  • qt4-qmake qt4-default (交叉编译时需要)
  • nsis (如果我们想在交叉编译后运行 make package,则需要)

  • 按如下方式安装这些软件包,如果您不是在 Ubuntu 18.04 上,请调整到您的软件包管理器:
    sudo apt-get --no-install-recommends install mingw-w64 git qt4-qmake qt4-default nsis
    

    获取源

    我假设你在你的主文件夹内,但这不是强制性的。不过,请确保相应地调整路径名称。
    git clone https://gitlab.kitware.com/cmake/cmake.git
    

    这应该将存储库克隆到子文件夹 cmake .

    为 Linux 构建 CMake(可选)

    注意:如果您的包管理器提供了适用于后续步骤的足够新的 CMake 版本,请随意跳过此步骤。

    改成这样:
    cd cmake
    

    并检查所需版本的标签(用 git tag -l 列出标签):
    git checkout v3.12.3
    

    引导 Linux CMake

    按照 Installing CMake 上概述的步骤进行操作:
    ./bootstrap
    

    (假设您仍在上一节中更改的子文件夹中)。

    该过程有望成功完成,最后两行类似于:
    ---------------------------------------------
    CMake has bootstrapped.  Now run make.
    

    所以按照说明调用 make :
    make
    

    现在应该构建实际的 Linux CMake,然后我们将使用它来构建 Windows CMake。

    make处理完成后,您应该在 bin 下拥有构成 CMake 的可执行文件,试试 cmake二进制以查看它是否有效:
    $ bin/cmake --version
    cmake version 3.12.3
    
    CMake suite maintained and supported by Kitware (kitware.com/cmake).
    

    优秀。

    Windows 构建的准备工作

    现在再次更改一个文件夹:
    cd ..
    

    并将之前的 Git 存储库克隆到名为 cmake-windows 的新目录中:
    git clone cmake cmake-windows
    

    然后切换到该目录并检查您之前为 Linux 选择的相同标签(或最新的稳定版或任何您喜欢的标签,真的):
    cd cmake-windows
    git checkout v3.12.3
    

    构建 Windows 版本的 CMake

    如果您好奇,请查看 revision 2 .它详细介绍了我第一次遇到的一个问题。基本上,构建的二进制文件无法在 Windows 上运行,这要求它们与某些库静态链接。不过,这些说明已经为您解决了这个问题!

    还在里面cmake-windows我们现在将构建 Windows 版 的 CMake。为此,我们需要创建一个“工具链文件”~/mingw-w64-toolchain.cmake如概述 here .创建一个包含以下内容的文件:
    # the name of the target operating system
    SET(CMAKE_SYSTEM_NAME Windows)
    
    # which compilers to use for C and C++
    SET(CMAKE_C_COMPILER i686-w64-mingw32-gcc-posix)
    SET(CMAKE_CXX_COMPILER i686-w64-mingw32-g++-posix)
    SET(CMAKE_RC_COMPILER i686-w64-mingw32-windres)
    
    # here is the target environment located
    SET(CMAKE_FIND_ROOT_PATH  /usr/share/mingw-w64 /usr/i686-w64-mingw32/ )
    
    # adjust the default behaviour of the FIND_XXX() commands:
    # search headers and libraries in the target environment, search
    # programs in the host environment
    set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
    set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
    set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
    SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libstdc++ -static-libgcc -static -lwinpthread" )
    

    然后调用 Linux cmake我们之前构建的二进制文件(如果您没有将主文件夹用作基本文件夹,请调整路径):
    ~/cmake/bin/cmake -DCMAKE_TOOLCHAIN_FILE=~/mingw-w64-toolchain.cmake -DKWSYS_LFS_WORKS=0
    

    这应该创建 Makefile然后我们可以使用它来构建 Windows 版本。

    然后运行(或 make -j 8):
    make
    

    后跟以下命令以创建安装包:
    make package
    

    结果

    结果应该是(扩展了变量):
    CPack: - package: $HOME/cmake/cmake-3.12.3-win32-x86.exe generated.
    

    您现在应该有一个仅依赖于系统库的 CMake 构建。

    最后但并非最不重要的一点是,将 Windows 版 CMake 的可信版本复制到您的 Windows 机器上,然后随意使用它。

    可能包括代码签名并将其提供给全世界,甚至引导 Windows 版 CMake 的“ native ”Visual Studio 构建?!

    关于windows - 通过在 Linux 上引导,然后交叉编译,从源代码构建适用于 Windows 的 CMake,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31711930/

    相关文章:

    c++ - 在 Direct2D 中绘制部分图像

    cpack 找不到库,此目录中不存在目标

    c++ - 如何在 CMake 的 CXX_FLAGS 中包含 `pkg-config --cflags --libs gtk+-2.0`

    python getpass编码

    c - 在 Windows XP 中手动更新 shell32.dll 是否安全/实用?

    c++ - Windows 7中的进程和线程优先级

    Python:使用 wmi 远程启动可执行文件

    linux - 事件.h : No such file or directory even when libevent-dev is installed

    c++ - jsoncpp链接错误cmake

    cmake - 如何防止 CMake 在安装时为共享库创建符号链接(symbolic link)?