首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

可移植的 Makefile 教程

在依赖树中,指定一条或多条边的语法非常简单: target [target...]: [prerequisite...] 从技术层面来讲,虽然多个目标可以通过一个单一规则指定,但是这种做法并不常见。...如果你打算创建示例中的源文件,并调用 make, 你会发现它实际上已经知道了它该如何构建目标文件。...因为树的不同分支可以被独立地进行更新,所以有很多并行化的空间。很多 make 的实现都支持通过 -j 选项进行并行构建。...$ make CC=clang CFLAGS='-O3 -march=native' 如果用户不想在每次调用时指定这些宏,他们可以(小心)使用 make 的 -e 标志从环境中覆盖宏定义。...他们的 cl.exe 编译器使用 .obj 作为目标文件扩展名, .exe 作为二进制扩展名,这两个扩展名与 unix 系统都不同,所以它有一些不同的内置推断规则。

1.4K10

CMake使用教程和原理

一、什么是CMake CMake是一个主要用于CPP的构建工具。CMake语言是平台无关的中间编译工具。同一个CMake编译规则在不同系统平台构建出不同的可执行构建文件。...CMake旨在解决各平台的不同Make工具的产生的差异(比如GNU Make, QT的qmake,微软的nmake, BSD的pmake)。...CMake是具有管理依赖项,依赖之间的关系。如果变更了源文件,必须重新构建所有依赖该源文件的脚本。 并且要求高效的依赖关系解析是耗时短的。...当这些文件有变化,都会从cmake的重新构建。 image.png depend.make和DependInfo.make:所有object的依赖关系。...因为涉及到不同平台下C++程序的后缀名不一样,在Windows下我们常用的就是一个.cpp扩展名,还有gcc一般用c.cc.cxx 等等都是C++文件的扩展名。

13.7K297
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    xmake v2.3.2 发布, 带来和ninja一样快的构建速度

    这个版本重点重构优化了下内部并行构建机制,实现多个target间源文件的并行编译,以及并行link的支持,同时优化了xmake的一些内部损耗,修复影响编译速度的一些bug。...通过测试对比,目前的整体构建速度基本跟ninja持平,相比cmake/make, meson/ninja都快了不少,因为它们还额外多了一步生成makefile/build.ninja的过程。...项目源码 官方文档 一些优化点 多个target间所有源文件同时并行构建(之前不能跨target,中途会被link给堵住串行化) 多个无依赖的target的link可以并行执行(之前只能挨个执行link...) 修复之前的任务调度bug,更加细粒度化调度,充分利用cpu core资源 优化xmake内部api上的一些损耗,这块效果也很明显 更多优化细节可以看下:issue #589 构建速度对比 我们在termux...和macOS上做了一些对比测试,测试工程在: xmake-core 对于相对比较多的target的项目,新版xmake对其构建速度的提升更加明显。

    85410

    翻译qmake文档(四) Building Common Project Types

    你可以在.pro文件里使用这些变量指定应用程序相关的信息。 HEADERS -应用程序头文件的列表。 SOURCES -应用程序c++源文件的列表。...FORMS - 应用程序UI文件的列表(用Qt Designer创建的) LEXSOURCES -应用程序Lex 源文件的列表 YACCSOURCES - 应用程序Yacc 源文件的列表 TARGET ...(debug, debug|release) { TARGET = debug_binary } else { TARGET = release_binary } 上面的代码片段作用域修改在每个模式下的构建目标用来确保结果目标拥有不同的名字...可以使用默认的规则处理 make 在两种模式下安装 build_all选项确保在安装规则被调用时将安装指向的两个目标版本: make install 也可以根据目标平台自定义构建目标的名字。...例如,一个库或插件可以在windows和Unix平台使用不同的命名习惯。

    942100

    如何使用Makefile在Ubuntu上自动执行重复任务

    介绍 如果您有从Linux服务器上的源代码安装软件的经验,您可能会遇到make实用程序。该工具主要用于自动编译和构建程序。它允许应用程序的作者轻松地布置构建该特定项目所需的步骤。...从手册页中,我们可以看到make将查找名为GNUmakefile的文件,然后查找makefile,然后查找Makefile。...您可以根据需要添加任意数量的缩进行和命令。Make会一次一个地浏览它们。 在命令告诉make以不同的方式处理它们之前,我们可以放置一些东西: -:命令前的破折号告诉make如果遇到错误则不中止。...这基本上采取以下形式: original_extension.target_extension: 这不是一个实际的目标,但它将匹配任何具有第二个扩展名的文件的调用,并在第一个扩展名中将它们构建出文件。...make 正如您所看到的,很容易将任务串联在一起,并且可以选择一个流程到某一点。例如,如果您只想转换文件并需要在不同的服务器上托管它们,则可以使用webify目标。

    2.4K00

    CMake学习笔记合集

    内部构建和外部构建 上述例子就是内部构建,他生产的临时文件特别多,不方便清理 外部构建,就会把生成的临时文件放在build目录下,不会对源文件有任何影响强烈使用外部构建方式 外部构建方式举例 //例子目录...当然..表示上一级目录,你可以写CMakeLists.txt所在的绝对路径,生产的文件都在build目录下了 在build目录下,运行make来构建工程 注意外部构建的两个变量 HELLO_SOURCE_DIR...,所以应该在src下的CMakeLists.txt下写 安装 一种是从代码编译后直接 make install 安装 一种是打包时的指定 目录安装。...简单的可以这样指定目录:make install DESTDIR=/tmp/test 稍微复杂一点可以这样指定目录:....静态库和动态库的区别 静态库的扩展名一般为“.a”或“.lib”;动态库的扩展名一般为“.so”或“.dll”。

    2.2K20

    CMake学习笔记

    最关键的是,它自动生成了Makefile. 4、使用make命令编译 root@localhost cmake]# make Scanning dependencies of target hello...当然..表示上一级目录,你可以写CMakeLists.txt所在的绝对路径,生产的文件都在build目录下了 3、在build目录下,运行make来构建工程 注意外部构建的两个变量 1、HELLO_SOURCE_DIR...,所以应该在src下的CMakeLists.txt下写 安装 一种是从代码编译后直接 make install 安装 一种是打包时的指定 目录安装。...简单的可以这样指定目录:make install DESTDIR=/tmp/test 稍微复杂一点可以这样指定目录:....静态库和动态库的区别 静态库的扩展名一般为“.a”或“.lib”;动态库的扩展名一般为“.so”或“.dll”。

    2.1K20

    Android.mk语法解析

    这是必需的,因为所有的构建控制文件在一个gnu make执行上下文中解析,其中所有变量都是全局的。...LOCAL_SRC_FILES LOCAL_SRC_FILES := hello-jni.c LOCAL_SRC_FILES变量必须包含C和/或C++源文件的列表,这些文件将被构建并组装到模块中。...注意你应该这里不列出头文件和包含的文件,因为构建系统将自动为您计算依赖项;只列出源文件这将直接传递给编译器。 注意,C++源文件的默认扩展名是“.CPP”。...但是,可以通过定义变量LOCAL_CPP_EXTENSION来指定不同的变量本地扩展名。不要忘记初始点(即“.cxx”有效,而不是“cxx”)。...TARGET_ARCH 目标CPU架构名 TARGET_PLATFORM 目标平台的名字 TARGET_ARCH_ABI LOCAL_C_INCLUDES LOCAL_C_INCLUDES :=

    1.8K00

    qmake手册(Qt5.9.3)

    项目文件可以包含许多不同的元素,包括注释,变量声明,内置函数和一些简单的控制结构。在大多数简单的项目中,只需要使用一些基本的配置选项来声明用于构建项目的源文件和头文件。...通常,您使用一系列的声明来指定项目中的资源,但支持简单的编程结构使您能够为不同的平台和环境描述不同的构建过程。 项目文件元素 qmake使用的项目文件格式可以用来支持简单和相当复杂的构建系统。...简单的项目文件使用简单的声明式样式,定义标准变量以指示项目中使用的源文件和头文件。复杂的项目可能使用控制流结构来微调构建过程。 以下各节介绍项目文件中使用的不同类型的元素。...这意味着可以从SUBDIRS项目中发出make check命令来运行整个测试套件。 检查目标的执行可能由某些Makefile变量定制。...在这种情况下,您可以明确地调用全部目标来同时构建两个配置: make all 注意:生成Visual Studio和Xcode项目时的细节略有不同。

    5.8K20

    程序员C语言快速上手——工程篇(十三)

    bat脚本,创建一个名为build的文件(文件名任意),修改其扩展名为build.bat,使用文本编辑器编辑该文件(Linux平台上,则保存扩展名build.sh) gcc add.c sub.c mul.c...而make 工具会自动根据修改情况完成源文件的对应.o文件的更新、库文件的更新以及最终的可执行程序的更新,它实际上是通过比较对应文件的最后修改时间,来决定哪些文件需要更新、那些文件不需要更新。...在Linux平台下,通常是将C语言的源代码和Makefile脚本一同发布出去,用户只需要在源码目录下分别执行命令make、make install即完成了程序的编译和安装,可以看到,有了make工具后,...Ninja,实际上CMake从2.8.9版本开始可以支持Ninja构建 Ninja 是一个注重速度的小型构建系统。...它与其他构建系统在两个主要方面不同:它被设计为使其输入文件由更高级别的构建系统生成,并且被设计为尽可能快地运行构建。

    3.1K30

    【Linux】《how linux work》第十五章 开发工具

    虽然你可以手动编译多个源文件,就像上面的例子所示,但是当源文件数量增多时,在编译过程中跟踪所有这些文件可能会很困难。 在第15.2节中描述的make系统是管理编译的传统Unix标准。...为了构建一个目标,make遵循一个规则,比如从一个.c源文件到一个.o目标文件的规则。 make已经知道了几个规则,但你可以自定义这些现有规则并创建自己的规则。...The first target is always the default, the target that make wants to build when you run make by itself...of Makefile or makefile -n 打印出构建所需的命令,但不实际运行任何命令 -f file 告诉make从file中读取,而不是从Makefile或makefile中读取 15.2.6...现在你已经了解了系统上的编程工具基础知识,接下来可以看看它们能做什么了。下一章将详细介绍如何在Linux上从源代码构建软件包。

    11110

    Android自动打包工具aapt详解

    我们可以查 看,创建, 更新ZIP格式的文档附件(zip, jar, apk)。...aapt打包流程 aapt传统的打包主要是最res和java代码的打包,aapt打包走的是单线程、流水式的任务从上到下进行打包构建。 ?...传统的aapt打包,aapt会执行2次,第一次是生成R.java,参与javac编译,第二次是对res里面的资源文件进行编译,最后APKBuilder会把DEX文件与编译好的资源文件及DEX文件进行打包成...整个流程下来,没有任何缓存,没有并发,也没有增量,每次构建都是一个全新的过程,所以每次构建时间也比较恒定,代码量,资源量越多,构建时间越慢。...aapt常用的参数 我们可以通过aapt help来查看常用的参数。 Usage: aapt l[ist] [-v] [-a] file.

    4.1K81

    如何发布一个 TypeScript 编写的 npm 包

    项目我们的库称为digx。它允许从嵌套对象中根据路径找出值,类似于lodash中的get函数。...npm包可以在这里找到。GitHub仓库地址在这里。初始化项目让我们从创建空目录并初始化它开始。...打开package.json,更新scripts的内容:"scripts": { "build": "tsc"}现在我们可以用npm run build来运行构建...这样会失败的,因为我们还没有任何可以构建的代码...我不觉得要发布任何配置文件,也不觉得要发布源文件和测试文件。我们可以做的一件事是使用.npmignore,列出所有我们不想发布的文件。...运行以下命令:npm publish --dry-run并确保只包括所需的文件。当一切准备就绪时,就可以运行:npm publish测试一下让我们创建一个全新的项目并安装我们的模块。

    1.4K20

    一天一个 Linux 命令(18):ln 命令

    当需要在不同的目录,用到相同的文件时,不需要在每一个需要的目录下都放一个必须相同的文件,只要在某个固定的目录,放上该文件,然后在 其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。...When creating hard links, each TARGET must exist....Otherwise, the last option specified controls behavior when a TARGET is a symbolic link, defaulting to...硬链接是存在同一个文件系统中,而软链接却可以跨越不同的文件系统。 五、软链接和硬链接区别 1.软链接 (1).软链接,以路径的形式存在。...类似于Windows操作系统中的快捷方式 (2).软链接可以跨文件系统 ,硬链接不可以 (3).软链接可以对一个不存在的文件名进行链接 (4).软链接可以对目录进行链接 2.硬链接 (1).硬链接,以文件副本的形式存在

    56830

    CMake 秘籍(八)

    ,我们将结合前面章节中讨论的多个不同的构建块,并将其应用于一个实际项目。...由于我们还没有定义任何目标,我们可以从将选项保存在一个中心文件开始,但稍后我们可能会将选项定义移到更接近目标的位置,以限制范围并得到更可重用的 CMake 构建块。...从可执行文件和非常少的目标开始,稍后限制范围 让我们添加一些源文件。...对于 Vim 示例,我们可以从 src/Makefile 和 src/configure.ac 中获得关于源文件分组的更多见解。从这些文件中,我们可以推断出大多数源文件是基本的和必需的。...我们不喜欢这种方法,在我们的示例 CMake 移植中将采取不同的做法:这些文件将在构建目录中生成。

    19810

    python包合集-shutil

    fsrc:源文件 path:目标地址 四、copyfileobj()   1、描述:以文件对象的形式,将一个文件的内容拷贝到另一个文件中,如果目标文件本身就有内容,来源文件的内容会把目标文件的内容覆盖掉...3、工程示例      该项目中创建一个test1,文件夹里面创建,e.doc, f.xls, g.txt 等不同后缀的文件用做测试   4、代码演示 shutil.copytree('/Users/...()   1、描述:压缩打包   2、语法:make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0,dry_run...=0, owner=None, group=None, logger=None) base_name: 压缩包的文件名,也可以是压缩包的路径。...文件夹可以不存在,会自动生成 format:解压格式,默认为None,会根据扩展名自动选择解压格式   3、代码示例 shutil.unpack_archive(filename='/Users/houlei

    35930

    Linux | Rsync 命令:16 个实际示例(下)

    利用rsync命令,您可以轻松地在不同目录、硬盘和网络之间进行数据的远程和本地复制与同步,进行数据备份,以及在两台Linux系统间创建镜像。...使用 Rsync 包含具有特定扩展名的文件 要在 rsync 操作期间包含特定文件或模式,可以使用 --include 选项以及与所有文件匹配的扩展名。...使用 Rsync 排除具有特定扩展名的文件 同样,要在 rsync 操作期间排除特定扩展名,您可以使用带有通配符模式的 --exclude 选项。...传输后自动删除源文件 现在,假设您有主 Web 服务器和数据备份服务器,您创建了每日备份并将其与备份服务器同步,但现在您不想在 Web 服务器中保留备份的本地副本。...使用此选项不会对文件进行任何更改并显示命令的输出,如果输出显示与您想要的完全相同,那么您可以从命令中删除“--dry-run”选项并运行在终端上。

    16510
    领券