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

问题描述 投票:0回答:1

我有一个依赖 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} ...)

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

linux windows cmake exe
1个回答
6
投票

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

mingw-w64-cmake
。这些包应该可以帮助你:

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

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

然后您可以使用常规 CMakeLists.txt 运行

mingw-w64-cmake
而不是
cmake
。例如:

mkdir build-mingw; cd build-mingw
x86_64-w64-mingw32-cmake ../
make

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

# 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()

这会创建一个用户可以设置的变量 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()

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

© www.soinside.com 2019 - 2024. All rights reserved.