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

2024-01-03

我有一个具有 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(使用前将#替换为@)

CMake - 在 Linux 中编译,在 Windows 中执行 的相关文章

  • 如何在 Linux 和 C 中使用文件作为互斥体?

    我有不同的进程同时访问 Linux 中的命名管道 并且我想让此访问互斥 我知道可以使用放置在共享内存区域中的互斥体来实现这一点 但作为一种家庭作业 我有一些限制 于是 我想到的是对文件使用锁定原语来实现互斥 我做了一些尝试 但无法使其发挥作
  • 使用 IDLE 编辑的 .py 文件消失了

    我曾经有过Edit with IDLE当我右键单击时的选项 py文件 但我多次卸载 重新安装以使某些东西正常工作 但现在它消失了 我检查了注册表HKEY CLASSES ROOT and HKEY LOCAL MACHINE对于价值低于Py
  • 如何让脚本执行结束后自动删除?

    是否可以制作一个Python脚本 在Windows中执行结束时删除 py文件 自删除 这种方式使您的程序不依赖于操作系统 from os import remove from sys import argv remove argv 0 奖励
  • “git add”返回“致命:外部存储库”错误

    我刚刚进入 git 的奇妙世界 我必须提交我对程序所做的一系列更改 位于名为的目录中 var www myapp 我创建了一个新目录 home mylogin gitclone 从这个目录中 我做了一个git clone针对公共回购 我能够
  • 如何将 OpenCV 的测试框架与 CMake 结合使用?

    好像 OpenCV 有一个测试框架 https github com Itseez opencv tree ef91d7e8830c36785f0b6fdbf2045da48413dd76 modules ts include opencv
  • 如何并行执行4个shell脚本,我不能使用GNU并行?

    我有4个shell脚本dog sh bird sh cow sh和fox sh 每个文件使用 xargs 并行执行 4 个 wget 来派生一个单独的进程 现在我希望这些脚本本身能够并行执行 由于某些我不知道的可移植性原因 我无法使用 GN
  • 如何更改选项卡控件的名称

    我在 C WinForms 应用程序中使用选项卡控件 我想更改选项卡的标题 默认情况下它们是 tabPage1 tabPage2 等 一种无需代码即可实现的懒惰方法 选择选项卡控件 Go to properties use F4 to do
  • /sys/device/ 和 dmidecode 报告的不同 CPU 缓存大小

    我正在尝试获取系统中不同缓存级别的大小 我尝试了两种技术 a 使用 sys device 中的信息 这是输出 cat sys devices system cpu cpu0 cache index1 size 32K cat sys dev
  • Windows7上python3.5无法安装BeautifulSoup4

    我已经从下载了 beautifulsoup4 4 5 3 tar gzhttps www crummy com software BeautifulSoup bs4 download 4 5 https www crummy com sof
  • 以编程方式最小化/恢复窗口,跳过动画效果

    我需要对窗口列表执行多项操作 最小化其中一些 恢复其他 以便立即在两组或多组窗口之间切换 这样做的问题是最小化和恢复窗口时可以看到的动画 整个过程看起来很糟糕 所有这些动画都进进出出 上下移动 但是 我无法禁用这些动画 因为这是针对其他计算
  • 嵌入清单文件以要求具有 mingw32 的管理员执行级别

    我正在 ubuntu 下使用 i586 mingw32msvc 交叉编译应用程序 我很难理解如何嵌入清单文件以要求 mingw32 具有管理员执行级别 对于我的例子 我使用了这个hello c int main return 0 这个资源文
  • Windows 上的 Openssl 错误 0x02001005 和 0x2006D002?

    我正在尝试使用 openssl 将 cer 证书转换为 p12 证书 这是我正在使用的命令 C OpenSSL Win32 bin gt openssl x509 inform der in developer identity cer o
  • 批量删除文件名中包含 BASH 中特殊字符的子字符串

    我的目录中有一个文件列表 opencv calib3d so2410 so opencv contrib so2410 so opencv core so2410 so opencv features2d so2410 so opencv
  • 访问图像的 Windows“标签”元数据字段

    我正在尝试进行一些图像处理 所以现在我正在尝试读取图像 exif 数据 有 2 个内置函数可用于读取图像的 exif 数据 问题是我想读取图像标签 exifread and imfinfo这两个函数都不显示图像标签 Is there any
  • 在内核代码中查找函数的最佳方法[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我开始浏览内核代码 遇到的一件事是如何跟踪函数调用 结构定义等 有没有一种好的方法可以快速跳转到函数定义并退出 我尝试过 Source N
  • 如何在Windows上模拟socket.socketpair

    标准Python函数套接字 套接字对 https docs python org 3 library socket html socket socketpair不幸的是 它在 Windows 上不可用 从 Python 3 4 1 开始 我
  • 在 Windows 上不使用 OpenSSL 从 pfx 文件或证书存储中提取私钥

    正如标题所示 我想在不使用 OpenSSL 或任何其他第三方工具的情况下导出我的私钥 如果我需要一个 cer文件或 pfx我可以通过 MMC 或 PowerShell 轻松导出这些文件pkiclient但我找不到获取私钥的方法 https
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 如何将 GIT 调用的输出获取到批处理脚本中的变量中?

    我有一个 git 命令来获取当前存储库的最新 SHA 如下所示 git log pretty format H n 1 我有一个 Windows 批处理脚本 我想按如下方式使用它 SET CURRENT SHA 但我不知道如何将从 git
  • 如何从Windows阻止社交媒体[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我想根据时间阻止我的电脑上的社交媒体 晚上 9 点后屏蔽 上午 11 点后解锁 如家长控制 我尝试过关注但失败了 创建了

随机推荐

  • 单击删除父 div

    我正在尝试通过单击链接来删除 div 问题是相同的 div 和链接有多个结构 我尝试制作一个函数 但它删除了所有 div document on click fd bxx cls function e e preventdefault th
  • 如何修复这个 MySQL 触发器?

    我正在尝试让这个触发器发挥作用 CREATE TRIGGER Transaction insert BEFORE INSERT ON Transaction FOR EACH ROW WHERE Number NEW AccountNumb
  • Go 中生产者/消费者最简洁的习惯用法是什么?

    我想做的是拥有一组生产者 goroutine 其中一些可能完成也可能不完成 和一个消费者例程 问题在于括号中的警告 我们不知道将返回答案的总数 所以我想做的是 package main import fmt math rand func p
  • 如何将 docker 与 drupal 和 drush 一起使用?

    我想用drush https github com drush ops drush 它需要在drupal容器中运行 还有一个drush docker 仓库 https hub docker com r drush drush 但我不知道如何
  • 防止电脑休眠

    我有一个正在播放某种媒体的应用程序 我不希望计算机在我的应用程序运行时进入睡眠状态 我查了一下 发现这个可以通过P Invoke来完成 显示器也不应该关闭 计算机也不应该进入睡眠状态 因此 我做了以下操作来测试这一点 b Click x y
  • Git 从现有远程分支添加工作树

    在我的远程存储库中有 3 个分支 主分支和 2 个长期运行的分支 master the common features are here like Core DAL north customized for A company long r
  • 将 PreviewKeyDown 中收到的密钥转换为字符串

    我在窗口上使用 PreviewKeyDown 事件来接收来自条形码扫描仪的所有键 KeyEventArgs 是一个枚举 没有给我实际的字符串 我不想使用 TextInput 因为某些键可能由控件本身处理 并且可能不会冒泡到 TextInpu
  • Spring Boot 应用程序中没有可用的合格 bean 类型

    运行我的 SpringBoot 应用程序时 出现以下错误 运行时出现异常 null IncationTargetException 创建名称为 bookController 的 bean 时出错 通过字段 bookRepository 表达
  • 提升::精神::气。如何将内联解析器表达式转换为独立语法,以及如何解压它们生成的元组?

    我正在使用 QI 和 Phoenix 我想编写一个返回 4 个布尔值的小语法 这些布尔值将用作语义操作内函数调用的参数 我有几个需要这些东西的函数 到目前为止我已经使用了这种方法 qi bool gt gt qi bool gt gt qi
  • 在 x86 上处理非常大的列表

    我需要处理大量浮点数 但在 x86 系统上遇到了内存限制 我不知道最终的长度 所以我需要使用可扩展类型 在 x64 系统上 我可以使用
  • 如何删除除每小时一条记录之外的所有记录

    我有一个包含数百万条传感器记录的 mysql 表 其结构如下 datanumber auto increment stationid int sensortype int measuredate datetime data medtext
  • TPL Dataflow,Post() 和 SendAsync() 之间的功能区别是什么?

    我对通过 Post 或 SendAsync 发送项目之间的区别感到困惑 我的理解是 在所有情况下 一旦一个项目到达数据块的输入缓冲区 控制权就会返回到调用上下文 对吗 那么为什么我需要 SendAsync 呢 如果我的假设不正确 那么我想知
  • 在 R 中使用 t.test() 时出错 - 没有足够的“x”观测值

    我尝试进行 t test 但它给了我这样的错误 在 R 中使用 t test 时出错 没有足够的 x 观察值 数据只有数值 没有 NA 组的比例是10比35 如何避免这种情况 先谢谢您的帮助 t test data Vrajdeb data
  • spring tx:advice和spring aop切入点的区别

    我是 Spring 新手 具有 Hibernate 的工作知识 我的工作是使用 Spring 声明式方法来实现事务 在 Google 的帮助下我成功完成了 感谢 Google 但无法清楚地理解我在 application context x
  • 如何正确配置 Julia 便携式或独立式

    如何正确配置Julia 便携式或独立式 https julialang s3 julialang org bin winnt x64 1 5 julia 1 5 0 win64 zip 对于外部存储 USB 驱动器发生的一切 添加 更新软件
  • libpcap 还是 PF_PACKET?

    我知道这个问题已经讨论过很多次了 我应该使用 libpcap 还是 PF PACKET 数据链路套接字 来捕获数据包 根据我的研究 几乎所有地方都建议使用 libpcap 而不是 PF PACKET 主要是因为它的可移植性 然而 对于我当前
  • 替换 Flutter 中的片段等小部件

    我是颤振新手 我有一个带有 2 个子小部件 Android 中的 2 个片段 的应用程序 当我单击 WidgetA 中的下一个按钮时 我想将该小部件替换 或推送 到 WidgetChildA 中 就像 Android 中的推送 或替换 片段
  • 什么开源消息队列软件可以提供严格排序的耐用性?

    我们需要的是实际上作为队列工作的 RabbitMQ并且不这样做 http www rabbitmq com faq html message ordering 消息应该保留在队列的头部 直到客户端明确地将它们出队 这似乎是一个非常简单的场景
  • Asp Net Core Web 推送通知

    主要目标是向站点添加发送 Web 通知的功能 以弹出系统通知 以使用 Html5 Push API 和服务工作人员提醒用户 不使用 SignalR 它只能在打开站点时运行客户端脚本 如前所述 还应该能够在网站关闭时发送通知here http
  • CMake - 在 Linux 中编译,在 Windows 中执行

    我有一个具有 Linux 依赖项的大型代码库 我想使用 CMake 将我的代码编译成可以在 Windows 上运行的可执行文件 即我希望 CMake 生成一个 exe 文件或类似性质的文件 我尝试过使用CMake网站上提供的解决方案 htt