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

wpx232ag  于 11个月前  发布在  Linux
关注(0)|答案(1)|浏览(196)

我有一个依赖于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兼容的可执行文件。

8tntrjer

8tntrjer1#

在Linux中需要一个mingw-w64工具链来完成这一任务,例如在Arch Linux上,你可以通过AUR获得所有必要的mingw-w 64-.包,包括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()


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

相关问题