【问题标题】:CMake - Compile in Linux, Execute in WindowsCMake - 在 Linux 中编译,在 Windows 中执行
【发布时间】:2020-11-20 12:11:24
【问题描述】:

我有一个包含 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 上构建 CMake 项目,并在 Windows 上使用生成的可执行文件。这称为交叉编译。交叉编译是一个相当大的话题,所以无法在 Stack Overflow 上详细描述。只需谷歌搜索“cmake cross-compile Linux Window”之类的内容,选择适合您任务的参考并遵循它。你会遇到一个具体的问题,那么你可以在这里问这个问题。
  • 我已经查过了,但是提出的解决方案没有奏效。我在 CMake 的网站上使用了建议的工具链:cmake.org/cmake/help/v3.4/manual/… 但它并没有改变任何东西。我将 CMAKE_CROSSCOMPILING 设置为 true,将 CMAKE_SYSTEM_NAME 设置为 Windows,将 CMAKE_SYSTEM_VERSION 设置为 10.0
  • 我也在尝试使用 mingw 在 CMake 中编译,但是我还没有让它工作。
  • 描述您具体尝试了什么:您将哪些代码放入工具链文件中,您如何使用该工具链调用cmake,您收到了哪些确切消息等. 将此描述添加到问题帖子中。
  • 您似乎错误地理解了 CMake 中的工具链 是什么。这不是您需要放入CMakeLists.txt。在 CMake 工具链中是一个单独的文件。确切地说,此文件应包含 CMAKE_CROSSCOMPILINGCMAKE_SYSTEM_NAME 等设置。工具链文件是为 cmake 调用指定的,并带有额外的 -DCMAKE_TOOLCHAIN_FILE=path/to/file 选项。

标签: linux windows cmake exe


【解决方案1】:

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

  • mingw-w64-binutils-symlinks
  • 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()

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

【讨论】:

    猜你喜欢
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 2021-03-04
    • 2011-08-15
    • 2021-12-06
    • 1970-01-01
    • 2012-05-11
    相关资源
    最近更新 更多