通过在Linux上引导,从源代码构buildCMake,然后进行交叉编译

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

所以,如果你像我一样,不信任预构build的二进制文件,你可能会发现下面的答案是有用的。

我遇到了一些关于Windows的CMake构buildpath的问题,所以下面的答案可能会让您省略一些试验或错误,或者重复一些步骤。


上次我检查MinGW的发行版本也没有签名,除此之外,与Linux上的GCC相比,它显得相当迟钝。

为了构建CMake,我们需要一个工作的CMake。 赶上22,正确的,因为我们不能相信官方下载页面上提供的二进制文件。

这个答案描述了如何使用源代码引导的Linux CMake为Linux构建CMake的Windows(32位,即x86)版本。

通过Git引导的Linux CMake构建CMake 3.3.0 for Windows

存储库列表可以在这里找到CMake Wiki。

我们的构建系统

就我而言,我选择Linux Mint 17.2(基于Ubuntu 14.04)作为构建系统来引导Windows版本。

我假设已经安装了meta-package build-essential 。 它包含了我们需要的大部分构建工具。 事实证明,Qt4中的qmake并不是Linux版本cmake的初始引导所必需的,但是对于Windows版本来说,它必需的。

如果您没有安装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 (在交叉编译期间需要)
  • nsis如果我们想要在交叉编译之后运行make package ,则是必需的)

安装这些包如下:

 sudo apt-get --no-install-recommends install mingw-w64 qt4-qmake nsis 

获取源代码

我假设你是在你的家庭文件夹,但它不是强制性的。 不过,请务必相应地调整可能的路径名称。

 git clone git://cmake.org/cmake.git 

这应该将资源库克隆到子文件夹cmake 。 改成:

 cd cmake 

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

 git checkout v3.3.0 

引导一个Linux CMake

按照安装CMake中列出的步骤进行操作:

 ./bootstrap 

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

这个过程有望成功完成,最后两行是这样的:

 --------------------------------------------- CMake has bootstrapped. Now run make. 

所以按照说明调用make

 make 

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

make过程完成后,你应该有包含在bin下的CMake的可执行文件,尝试cmake二进制文件来查看它是否工作:

 $ bin/cmake --version cmake version 3.3.0 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.3.0 

构建CMake的Windows版本

仍然在cmake-windows我们现在将构建CMake的Windows版本 。 为此,我们需要创建一个“工具链文件” ~/mingw-w64-toolchain.cmake如下所述。 使用以下内容创建一个文件:

 # 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) SET(CMAKE_CXX_COMPILER i686-w64-mingw32-g++) 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) 

然后调用我们之前为Linux构建的cmake二进制文件(如果您没有使用主文件夹作为基本文件夹,请调整路径):

 ~/cmake/bin/cmake -DCMAKE_TOOLCHAIN_FILE=~/mingw-w64-toolchain.cmake 

这应该创建我们可以用来构建Windows版本的Makefile 。 再一次记住,如果qmake不可用, 失败的一步。 所以确保安装了qt4-qmake软件包。

一旦完成,我们运行make并等待构建成功。 在构建步骤之后,我们可以调用make package来使用nsis软件包中的nsis来为构建的CMake创建一个安装包。

但是,您也可以手动复制包内容。 在我的情况下,它们位于cmake-windows下的子文件夹_CPack_Packages/win32-x86/NSIS/cmake-3.3.0-win32-x86/

惊喜

构建成功,但是当您尝试运行二进制文件时,您首先会看到一个不愉快的错误消息,如下所示:

cmake.exe  - 找不到入口点

cmake.exe – 找不到入口点

程序入口点_ZNKSt8__ detail20_Prime_rehash_policy11_M_next_bktEj不能位于动态链接库libstdc++-6.dll

一旦你调整你的构建来解决这个问题(通过静态链接libstdc++-6 ,你会遇到下一个):

cmake.exe  - 应用程序错误

cmake.exe – 应用程序错误

应用程序无法正确启动(0xc000007b)。 单击确定关闭该应用程序。

后者是由缺少libwinpthread-1.dll依赖关系造成的,可以通过使用静态链接再次对其进行处理。

静态链接libwinpthreadlibstdc++

解决的办法是通过从前面的工具链文件走私他们的链接器命令添加参数。 所以编辑~/mingw-w64-toolchain.cmake以包含以下附加行:

 SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libstdc++ -static-libgcc -static -lwinpthread" ) 

现在通过发出(仍然在cmake-windows里面)去除构建的二进制文件和包:

 rm -rf bin/*.exe _CPack_Packages/win32-x86/NSIS 

然后再运行:

 make 

这基本上只应该重新运行链接步骤; 随后可选(即如果你以前也这样做):

 make package 

结果

你现在应该在_CPack_Packages/win32-x86/NSIS/cmake-3.3.0-win32-x86/内部有一个CMake内部_CPack_Packages/win32-x86/NSIS/cmake-3.3.0-win32-x86/ ,它只依赖系统库。

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

包括,也许代码签名,使其可用于世界甚至引导一个“原生”的Visual Studio构建CMake的Windows?