CMake - 在 Linux 中编译,在 Windows 中执行

Nik*_*ong 6 linux windows exe cmake

我有一个具有 Linux 依赖项的大型代码库,我想使用 CMake 将我的代码编译成可以在 Windows 上运行的可执行文件,即我希望 CMake 生成一个“.exe”文件或类似性质的文件。

我尝试使用 CMake 网站上提供的解决方案:https://cmake.org/cmake/help/v3.4/manual/cmake-toolchains.7.html#cross-compiling 但它没有工作...

这是我的 CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(myProject VERSION 1.0 LANGUAGES C CXX)
set(CMAKE_CROSSCOMPILING true)
set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_SYSTEM_VERSION 10.0)
set(CMAKE_SYSTEM_PROCESSOR arm)
find_package(... *all my required packages* REQUIRED)
include(... *required include files*)
add_executable(${PROJECT_NAME} ...)
target_link_libraries(${PROJECT_NAME} ...)
Run Code Online (Sandbox Code Playgroud)

它可以在 Linux 上编译并执行,但我希望它生成一个与 Windows 兼容的可执行文件。

ypn*_*nos 6

您需要Linux 中的mingw-w64工具链来执行此操作,例如在 Arch Linux 上,您可以通过 AUR 获取所有必需的 mingw-w64-... 软件包,包括mingw-w64-cmake. 这些软件包应该可以帮助您:

  • mingw-w64-binutils-符号链接
  • mingw-w64-gcc
  • mingw-w64-cmake

安装其他软件来满足您的软件的任何依赖关系。

然后你可以直接运行mingw-w64-cmake而不是cmake使用常规的 CMakeLists.txt。例如:

mkdir build-mingw; cd build-mingw
x86_64-w64-mingw32-cmake ../
make
Run Code Online (Sandbox Code Playgroud)

然而,通常最好使用静态构建,这样您的可执行文件就可以独立工作。我是这样做的:

# STATIC stuff (Windows)
if (${CMAKE_SYSTEM_NAME} MATCHES "Windows")
        set(BUILD_FOR_WIN TRUE)
endif()
option(STATIC_BUILD "Build a static binary." ${BUILD_FOR_WIN})

if (STATIC_BUILD)
        set(CMAKE_EXE_LINKER_FLAGS "-static")
        set(CMAKE_FIND_LIBRARY_SUFFIXES ".a" CONFIG)
        set(BUILD_SHARED_LIBS OFF)
endif()
Run Code Online (Sandbox Code Playgroud)

它创建一个用户可以设置的变量 STATIC_BUILD,如果针对 Windows 进行编译,则默认为 ON。

您无需在 CMake 文件中进行太多调整。例如,我在构建 Qt 时需要包含额外的 Qt 平台插件:

if (STATIC_BUILD AND ${CMAKE_SYSTEM_NAME} MATCHES "Windows")
        # include plugins into static build on windows
        # (we lack support for static on other platforms right now)
        set(QT_PLUGINS SvgIcon WindowsIntegration WindowsVistaStyle)
endif()
Run Code Online (Sandbox Code Playgroud)

这里的关键要点是首先在您的系统上获得适当的环境。