我有一个具有 Linux 依赖项的大型代码库,我想使用 CMake 将我的代码编译成可以在 Windows 上运行的可执行文件,即我希望 CMake 生成一个“.exe”文件或类似性质的文件。
我尝试过使用CMake网站上提供的解决方案:https://cmake.org/cmake/help/v3.4/manual/cmake-toolchains.7.html#cross-compiling 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 兼容的可执行文件。
你需要一个mingw-w64 http://mingw-w64.org/Linux 中的工具链可以做到这一点,例如在 Arch Linux 上,您可以通过 AUR 获取所有必需的 mingw-w64-... 软件包,包括mingw-w64-cmake https://aur.archlinux.org/packages/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
然而,通常最好使用静态构建,这样您的可执行文件就可以独立工作。我是这样做的:
# 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()
这里的关键要点是首先在您的系统上获得适当的环境。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)