幸运的是,有一些标准我们可以遵守,而 CMake 可以帮助我们做到这一点。实际上,GNUInstallDirs.cmake模块所做的是定义一组变量。这些变量是不同类型的文件应该被安装的子目录的名称。...message,而不是目标名称message-shared:在构建时将生成libmessage.so.1。...在 CMake 的上下文中,生成器是用于生成原生构建脚本的工具,例如 Unix Makefiles 或 Visual Studio 项目文件,而在 CPack 的上下文中,这些是用于打包的工具。...因此,Debian 打包工具将被调用用于DEB包生成器,而在给定平台上适当的存档工具将被调用用于TGZ生成器。我们可以直接从build目录调用 CPack,并使用-G命令行选项选择要使用的生成器。...我们使用名称_build_dir而不是简单的build的原因是,在测试本地安装时,您的项目可能已经包含一个build目录,这会与新安装发生冲突。
脚本结构 NSIS脚本(下称nsi脚本)主要包含安装程序属性、页面、区段、函数。 属性 用来定义安装程序的行为和界面风格,这些属性大部分是编译时刻属性,即不能在运行时刻改变。...UninstPage instfiles 区段 是对应某种安装/卸载选项的处理逻辑,该段代码仅当用户选择相应的选项才被执行。...函数 包含了模块化的安装逻辑。 在nsi脚本中函数分为两种:用户自定义函数和回调函数。...(从技术上来说你可以修改改变量,但并不是一个好方法)。 ${NSISDIR} 包含 NSIS 安装目录的一个标记。在编译时会检测到。...这些命令主要用来包含文件、条件化编译、定义常量、定义宏等。定义常量和宏是编译器指令的最主要应用。 常用指令 文件、目录操作 File 作用:释放文件到当前输出路径。
其实常用的软件和运行库都提供了静默安装参数,但是不同的文件所加的参数并不一致,比如 VS 的环境库 vcredist_x86.exe (这是32位的环境库)后面加 /q 即可完成静默安装,而 NSIS.../M2 在调试器会话期间保留供WISE内部使用 示例: setup.exe /T 卸载WISE: /Z 删除空目录,包括其中包含不明智的目录。 /A 自动模式,除了取消,没有其他用户选择。.../S 无提示模式,无用户选择的自动模式 /R 回滚模式,选择卸载时回滚的选 /U 类似自动模式,但给出除了自定义/自动标题窗口之外的所有选项,标题可以在命令行。...这类的软件都会在安装结束后显示一个确认屏幕(CDex)或者一个设置文件关联方式的结束安装屏幕(Winamp) 怎么判断哪个程序是使用 NSIS 技术打包的?...很多用NSIS打包的程序在安装的时候都有类似的窗口,例如 Winamp 和 CDex 。
,还有 deb 等包格式也在陆续支持中,并且用户也可以配置生成自定义的包格式文件。...接着,我们需要自定义 on_installcmd 安装脚本,里面去配置如果编译源码包,我们可以简单的调用一个内置的编译安装脚本文件,也可以直接配置 make install 等编译安装命令。...> 需要注意的是,打二进制文件到包里,使用的是 add_installfiles 而不是 add_sourcefiles。...我们可以通过配置 add_targets 关联需要构建的目标,在生成的 srpm 包中,它会自动调用 xmake build 和 xmake install 去构建和安装包。...$ xmake pack -o /tmp/output 禁用自动构建 如果是打 NSIS 等二进制包,xmake pack 会先自动编译所有被绑定的 target 目标文件,然后再去执行打包逻辑。
其他的程序们ctest用于运行和报告测试结果的测试驱动程序,cpack用来生成安装程序和源包的打包程序,cmake-gui是 cmake 的图形界面,ccmake(注意ccmake比cmake多了一个c...构建软件是一个通用的过程:编译可执行程序和库、管理依赖关系、测试、安装、打包、生成文档和测试更多功能,当然了上述其中有一些步骤是可以跳过的,但至少我们需要使用CMake完成编译可执行程序。...CMake中的定义指令macro()和function()的实现与C风格的宏定义和C++的函数定义比较: • macro() 的工作方式像是查找和替换指令,而不是像function() 这样的实际子例程调用...与函数相反,宏不会在调用堆栈上创建单独的条目。所以宏中调用return() 将比在函数中返回调用语句的级别高一级(若已经在顶层作用域中,可能会终止执行)。...CMake为调整或扩展编译器标志提供了很大的灵活性,可以选择下面两种方法: • CMake将编译选项视为目标属性。因此,可以根据每个目标设置编译选项,而不需要覆盖CMake默认值。
它大胆地目标是成为下一个 Doxygen。 第十一章:安装和打包 我们的项目已经构建、测试并文档化。现在,终于到了将其发布给用户的时候。本章主要介绍我们将要采取的最后两个步骤:安装和打包。...名称,而不是一个导出的目标列表。...这里需要注意的是,生成的导出文件将包含在INSTALL_INTERFACE生成表达式中评估的目标路径,而不是BUILD_INTERFACE,就像export(EXPORT)一样。...它被视为一个包定义,负责提供任何包函数和宏,检查要求,查找依赖项,并包含目标导出文件。...这对于一个非常基础的打包情况解决了打包问题。现在,让我们学习如何处理更高级的场景。 创建高级配置文件 如果你管理的不仅仅是单个目标导出文件,那么在配置文件中包含几个宏可能是有用的。
该库是我们自己的实现的用于计算数字的平方根的库。可执行文件可以使用此库,而不是使用编译器提供的标准平方根函数。 在本教程中,我们将库放入名为MathFunctions的子目录中。...利用使用要求的主要命令是: 目标编译定义 目标编译选项 目标包含目录 目标链接库 让我们从第2步中重构代码,以利用现代的CMake方法编写使用要求。...我们使用option命令,因为它允许用户可以选择该值是On还是Off。 接下来,我们将重构MathFunctions使其成为使用mysqrt或sqrt封装的真实库,而不是要求调用代码执行此逻辑。...(第10步)添加生成器表达式 在构建系统生成期间会评估生成器表达式,以生成特定于每个构建配置的信息。...在"(第7步)构建安装程序"期间,我们添加了打包此资料的功能,以便可以将其分发给其他人。 下一步是添加必要的信息,以便其他CMake项目可以使用我们的项目,无论是从构建目录,本地安装还是打包的文件。
GuLoader 是一个 Shellcode 下载工具,因使用多种反分析技术来进行检测逃避而闻名。研究人员发现,GuLoader 近期针对韩国与美国的电子商务行业客户攻击频繁。...什么是 NSIS?...MSIS 是用于开源的 Windows 应用安装程序,其典型功能为: 基于脚本且完全免费 恶意代码可以与合法程序打包在一起 可直接调用 Windows API 来加载 .NET 模块、MSSQL 等已有插件...【ZIP 文件中的 NSIS】 【ISO 镜像文件中的 NSIS】 在压缩文件与镜像文件中嵌入可执行文件是能够进行检测逃避的,在野发现的可用于嵌入 NSIS 可执行文件的格式如下所示: 【格式列表】...至少 13 个国家/地区的十余个行业,都成为了攻击者的目标。 【国家分布】 【行业分布】 混淆处理 在 2022 年 2 月最初使用 NSIS 时,并没有对脚本进行混淆。
选择 CPack 的原因 C++ 工程大部分都是用 CMake 配置编译, 而 CPack 是 CMake 内置的工具,支持打包成多种格式的安装包。...一个简单的例子 基础配置 这里介绍如何打包 rpm 包,deb 的打包是一样的,区别在于一些配置。...Cpack 打包 rpm 用的是 CPack RPM 生成器,用到的配置变量是以 CPACK_RPM_XXX 为前缀。...如果想要查看打包过程的详细输出,可以在命令后面添加 --verbose。...分装多个包 上述配置是将所有需要打包的文件打包成一个安装包,但一个项目往往会有多个不同服务,在实施部署时需安装到不同的机子上,这个时候如果把所有服务一起打包,会导致部署时包太大。
引言在完成一个 C# Windows 桌面应用的开发后,下一步非常关键的工作就是打包应用以便分发。打包不仅能确保应用程序易于安装,还能包含所有必要的依赖项,为用户提供流畅的体验。...使用 ClickOnce 打包的步骤:在 Visual Studio 中打开你的项目。右键点击项目名称,选择 “发布” 选项。...使用 WiX Toolset 打包WiX Toolset 是一个开源的工具集,允许开发者通过 XML 定义复杂的安装包。WiX 支持高级功能,如安装多个组件、创建注册表项、服务安装等。...Inno Setup 和 NSIS第三方工具:Inno Setup 和 NSISInno Setup 和 NSIS 是两款常见的第三方打包工具,它们提供了更灵活的安装包配置选项。...Inno Setup 打包步骤:下载并安装 Inno Setup。使用其内置的脚本编辑器,编写安装脚本,定义要打包的文件、安装路径等。编译脚本,生成安装包。NSIS 打包步骤:下载并安装 NSIS。
您还将了解如何将外部依赖项添加到项目中:第三方库、测试框架、程序分析工具和文档生成器。最后,您将探索如何为内部和外部目的导出、安装和打包您的解决方案。...模块是用 CMake 语言编写的,包含宏定义、变量和执行各种功能的命令。它们从相当复杂的脚本(CPack和CTest也提供模块!)...你也可以定义自己的命令,这部分将在本章的理解 CMake 中的控制结构部分进行介绍。 与 C++ 相比,特别引人注目的是 CMake 中的命令调用不是表达式。...解释这些命令之间的区别最简单的方式是通过将它们与 C 语言风格的预处理器宏和实际的 C++函数进行比较: macro() 命令更像是一个查找和替换指令,而不是实际的子程序调用,如 function()...最后一个问题依然存在——为什么要在宏上而不是推荐函数上使用?在这种情况下,无限制访问全局变量是好的,由于我们没有向main()传递任何参数,所以我们不需要担心常见的警告。
说明: # Python是解释型语言,我们写的Flask或Django项目如果部署,源码可能会泄露,因此我们可以把项目打包成exe,来保护源码# 需要用到工具 -pyinstaller:把python...项目打包成不同平台的可执行文件 -nsis:NSIS(Nullsoft Scriptable Install System)是一个开源的 Windows 系统下安装程序制作程序,它提供了安装、卸载、...这如其名字所指出的那样,NSIS 是通过它的脚本语言来描述安装程序的行为和逻辑的 1.安装下载pyinstaller 添加国内镜像源,安装更加顺畅,此处添加豆瓣源 pip3 install pyinstaller...】:把开发完成的应用程序打包,部署到指定的环境,或者供其他应用程序来调用,属于工程化能力范畴。...在交付项目较多的团队,可以考虑使用更加灵活的工具去完成。
该文件中包含了一些宏定义和常量,用于定义和配置编译器在Illumos上的行为。下面是该文件中一些重要的部分: pre_link_args宏:用于指定在链接阶段传递给链接器的参数。...它包含了一些宏定义、常量和结构体,用于指定链接参数、编译选项以及目标平台的特性。通过这个文件,Rust编译器可以生成适用于Illumos操作系统的目标代码。...这些宏定义包括了目标架构特定的特性和选项,如编译器优化级别、链接器脚本、堆栈大小、ABI约定等。 另外,该文件中还包含了一些与硬件和操作系统相关的标志和结构体定义。...该结构体包含了一些字段和方法,用于定义在函数调用期间如何操作参数和返回值的。...这些规则和细节对于编译器和代码生成器来说至关重要,因为编译器需要根据ABI调用约定为代码生成器生成相应的目标代码,以保证生成的机器码能与目标平台的规范相匹配。
这些预定义的内部函数会在 Rust 代码中被调用,然后在编译期间被替换为对 Cranelift 编译器的调用。...这个宏定义是通过Rust编译器提供的track_caller!()宏来定义的。它使用track_caller()函数来获取调用栈信息,并生成相应的代码。...()宏主动触发一个panic,并将包含调用栈信息的错误信息作为参数传递给panic!()宏。...它使用自定义的宏定义和编译器提供的宏来获取并插入调用栈信息,以便在编译时生成包含调用栈信息的错误消息。这对于调试和分析Rust程序中的错误非常有帮助。...首先,在base.rs中定义了与GCC编译器的交互接口,包括与GCC相关的头文件、宏定义,以及一些编译选项的设置。这些接口和定义允许Rust编译器与GCC进行通信,生成目标平台的代码。
CodeGenOptSize枚举用于表示代码生成时的优化大小选项。它包含了几个变体,如Aggressive和Default,用于指定代码生成器应如何优化代码的尺寸。...它包含了源代码中的符号信息、变量名称、函数调用关系等,以方便开发人员在调试过程中定位和查找问题。 命名空间是一种在不同代码文件中组织和隔离符号的方法,以避免冲突和重复定义问题。...VCallVisibility enum VCallVisibility枚举定义了用于虚函数调用中的可见性级别的选项。虚函数是在运行时通过“虚函数表”进行调用的。...这些选项用于控制在编译期间如何访问虚函数。以下是VCallVisibility枚举的常见选项: Public - 公共可见性,表示任何代码都可以访问虚函数。...ident宏:该宏用于生成一个String类型的标识符。在Rust中,标识符通常用于变量、函数、方法等的名称,而不同的代码生成过程可能需要生成不同的标识符,这个宏就是用来处理这种情况的。
1.windeployqt和nsis介绍 windeployqt是一个Qt提供的非常有用的命令行工具,用于将Qt应用程序所需的所有依赖项自动复制到应用程序的构建目录中,以便在没有Qt安装的计算机上运行应用程序...只需在命令行中运行以下命令: # 编译好release程序后,进入对应路径 windeployqt 这样就能确保应用程序能够在没有Qt安装的计算机上独立运行,...nsis我用的版本是: nsis-3.02.1(最新版nsis是包含了下面的nisedit的) 2.用nisedit制作脚本 1.新建向导脚本 2.填写应用信息 3.设置图标、语言等 4.设置目录与授权信息...5.选择打包的程序文件 6.设置快捷方式 7.安装后运行方式(只有一个.exe就默认) 8.设置卸载提示 9.完成向导 生成的脚本如下,可自定义更改: 比如要在安装开始的时候选择语言,可以添加以下脚本...‘$LANGUAGE’是多语言变量,在安装程序结束后,语言代码会存储在这个变量中,手动修改‘$LANGUAGE’的值后,安装包会重新选择最匹配的语言,参考最上面NSIS手册中选择界面语言步骤 StrCmp
首先,该文件包含了一些宏和常量的定义,例如macro_rules! float_to_int_unsigned,它定义了将浮点数转换为无符号整数的宏。...这些不同的 SsaKind 枚举成员定义了不同类型的 SSA 节点,在 SSA 分析期间用于构建 SSA 树。...该文件中定义了一个名为if_is_sized_else的宏,该宏用于判断函数返回值是否为sized类型。Sized类型是指在编译时已知其大小的类型。...而对于unsized类型,它们的大小不是在编译时已知的,因此需要通过引用的方式返回。 该文件中的宏通过检查返回类型是否为sized类型来确定返回值的处理方式。...这个归档文件可以在链接过程中使用,将多个目标文件打包成一个文件,方便管理和使用。
2、定义 静态库和动态库从字面意思来看,区别就是静态和动态。而这里的静态和动态指的是库的链接阶段。可以看如下的编译过程。 静态库:在链接阶段库将会与目标汇编后的目标文件.o一起打包生成可执行文件。...动态库:而动态库在编译阶段都不会有什么动作,只有在程序运行时才被加载,也就是动态库的链接是发生在程序运行时期的,它和可执行文件是分开的,只是可执行文件在运行的某个时期调用了它。...优点 缺点 静态库 1、 使可执行文件依赖项少,已经被打包到可执行文件中了2、 编译阶段完成链接,执行期间代码装载速度快 1、 使可执行文件变大2、 若作为其他库的依赖库,将会造成多余的副本,因为必须与目标文件打包...这里使用通常的宏定义做法,如图所示。 头文件: 源文件: 生成动态库: 这里需要注意,生成两个有用文件,一个是.lib,一个是dll。...这里的.lib本质上不同于静态库中的.lib。这里的.lib一般是一些索引信息,记录了dll中函数的入口和位置,dll中是函数的具体实现。而静态库中的lib包含了索引和实现。
对于库、示例和单元测试,每个模块分别拥有自己的CMakeLists.txt,在其中定义了编译的目标并且在子目录中包含了相关的代码。...而项目的根目录的CMakeLists.txt则定义了配置选项,并将这些子模块的加入编译中去。...注意头文件的路径变量header_path,这个变量在不同的CMake子文件中是不同的,而源文件因为在同一目录中,则可以直接定义。...CMake有一个特性可以支持修复上述的问题,就是生成器表达式,这个特性可以允许设定目标对象在构建和安装时,使用不同的include目录,我们需要将target_include_directories()...这个文件的内容是能够被find_package()直接调用的脚本,通常包含了定义目标的代码,而这些代码我们已经通过install(EXPORT)命令生成在my_library.cmake文件中了,因此我们只需要在
宏的操作数需要按照严格的顺序进行排序,这在某些情况下可能会导致使用上的不便。在新的版本中,这个规则被放宽,提高了 asm! 宏的灵活性和易用性。 允许宏展开的 format_args 调用使用捕获。...在 Rust 1.70.0 的更新中,允许宏展开的 format_args 调用使用捕获。这个更新主要是关于 Rust 的宏系统。 在 Rust 中,宏(macro)是一种在编译时进行代码扩展的方式。..."允许宏展开的 format_args 调用使用捕获" 这个更新的含义是,当 format_args 宏在其宏体中使用变量时,这些变量现在可以是外部作用域中的变量,这就是所谓的 "捕获"。...这是一个破坏性的改变,因为一些在 const eval 期间的未定义行为(UB)现在被检测到,而不是被默默地忽略。...这个改动的目的是为了提高 Rust 在 {arm,thumb}v4t-none-eabi 目标上的构建效率和便利性。在这之前,用户可能需要手动安装并配置外部链接器来构建这个目标。
领取专属 10元无门槛券
手把手带您无忧上云