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

仅当使用GNU Make更改特定子目录时才编译文件

当使用GNU Make更改特定子目录时,只编译受影响的文件,这是为了提高编译效率和节省时间。GNU Make是一个构建自动化工具,它根据文件之间的依赖关系进行编译和构建。在大型项目中,源代码通常被组织成多个子目录,而不是一个巨大的代码库。当只更改了其中一个子目录中的文件时,使用GNU Make可以避免重新编译整个项目,而只编译受影响的文件,以提高构建效率。

使用GNU Make进行编译时,Makefile是必不可少的配置文件。Makefile中定义了各个文件之间的依赖关系和编译规则。当一个或多个文件发生变化时,Make会根据Makefile中的规则确定需要重新编译的文件,并自动执行编译操作。

使用GNU Make进行子目录的编译,可以通过在Makefile中设置特定的目标来实现。具体步骤如下:

  1. 在项目根目录下创建一个名为Makefile的文件。
  2. 在Makefile中定义顶层目标。这个顶层目标可以是项目中的任何一个子目录。
  3. 在每个子目录下创建一个名为Makefile的文件,用于定义该子目录下的编译规则和依赖关系。
  4. 在顶层Makefile中使用include命令引入各个子目录的Makefile。
  5. 在顶层Makefile中定义需要编译的子目录,并设置编译的顺序和规则。

例如,假设项目结构如下:

  • project/
    • Makefile
    • src/
      • main.c
    • lib/
      • util.c
      • util.h

其中,src目录包含主要的源代码文件,lib目录包含一些公共的库文件。

顶层Makefile内容如下:

代码语言:txt
复制
SUBDIRS := src lib

all: $(SUBDIRS)

$(SUBDIRS):
    $(MAKE) -C $@

.PHONY: all $(SUBDIRS)

src目录下的Makefile内容如下:

代码语言:txt
复制
TARGET := main
SRCS := main.c
OBJS := $(SRCS:.c=.o)

$(TARGET): $(OBJS)
    gcc -o $@ $^

%.o: %.c
    gcc -c -o $@ $<

.PHONY: clean

clean:
    rm -f $(OBJS) $(TARGET)

lib目录下的Makefile可以根据实际情况编写。

使用GNU Make时,执行make命令即可开始编译。如果只更改了src目录下的文件,Make会自动检测到该变化,并只重新编译src目录下的文件。而lib目录下的文件则不会被重新编译。

GNU Make的优势在于它能够自动化构建过程,并且只编译受影响的文件,提高了编译效率和构建速度。它广泛应用于软件开发领域,特别是大型项目的构建过程中。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云容器服务(Tencent Kubernetes Engine):https://cloud.tencent.com/product/tke
  • 腾讯云函数计算(Serverless Cloud Function):https://cloud.tencent.com/product/scf
  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

RPM打包原理、示例、详解及备查

那些需要安装在系统中的文件,我们需要在 %files 中声明它们,这样rpmbuild命令知道哪些文件是要安装的。...4.2 %build阶段 %build阶段顾名思义就是对解压到%_builddir下的源码进行编译的阶段,整个过程在该目录下完成。 许多程序使用 GNU configure 进行配置。...这适用于使用常用命令安装文件的情况,例如 cp 和 install。 手动执行安装。...如果您的包安装一个文件,如 /usr/sbin/mycommand,则 %files 部分如下所示: %files %{_sbindir}/mycommand 若要使软件包不受上游改动的影响,可使用通配符匹配所有文件...例如: %caps(cap_net_admin=pe) FOO.BAR 如果包含特定语言编写的文件,请使用 %lang 来标注: %lang(de) %{_datadir}/locale/de/LC_MESSAGES

10.6K71

CMake vs Make对比

程序员现在已经使用了CMake和Make了很久。您加入大公司或开始使用大型代码库开发项目,您需要处理所有这些构建。你必须看到这些“CMakeLists.txt”文件浮动。...根据哪些源文件更改,“自动”自动显示需要更新的文件。它还自动确定更新文件的正确顺序,以防一个非源文件依赖于另一个非源文件。 每当我们改变系统的一小部分时,重新编译整个程序将是低效的。...因此,如果您更改了一些源文件,然后运行“Make”,它不会重新编译整个事情。它更新直接或间接依赖于您更改的源文件的那些非源文件。很整洁!“Make”不限于任何特定语言。...当然,第三方库(如OpenGL)以便携式的方式被包含,CMake真的开始闪耀。 有什么不同? 如果您使用Makefile,即在命令行中键入“make”,则构建过程有一个步骤。...将CMake与Make进行比较使用CMake有几个优点: 跨平台发现系统库。 自动发现和配置工具链。 将文件更容易地以平台的方式将文件编译到共享库中,并且一般比make更容易使用

3.9K31

rpm包相关的那些事

rpm可以....确保本机有GNU/GCC 编译工具 (gcc 这个Package) 3. 确保本机有rpm工具(rpm 工具用来安装生成的rpm包) 4....确保本机有yum-builddep 工具(使用rpmbuild命令来生成rpm是,可能出现依赖问题,用yum-builddep可以快速解决依赖问题,而不需要手动一条条安装,可以使用yum provides...-div 解压得到的源码文件), 后一个里面是说明文件;其中SPECS里面的说明文件包含了 该rpm包的依赖,以及版本变更等信息, 还有特定的格式要求,所以不要随便修改这个文件,除非明白自己在做什么;...对应我们常用的config, make, makeinstall 的编译源代码 BUILDROOT ---如果rpmbuild的时候,没有指定 --buildroot 参数,那么一般为空 RPMS -

73011

ODrive开发 #1 ODrive固件开发指南

: 用于调用 tup Tup: 用于调用编译命令的构建系统 ARM GNU Compiler: 对于交叉编译代码 ARM GDB: 用于调试代码并在设备上逐步执行 OpenOCD: 用与使用STLink...ST-Link/V2 Drivers 配置编译参数 要自定义编译参数,请将文件Firmware/tup.config.default复制或重命名为Firmware/tup.config,然后在该文件中编辑参数...某些测试项目只需要一个电机加上编码器就可以,还有一些测试需要特定的测试台可以。...所有 CubeMX 相关的文件都在 Firmware/Board/v3文件夹下。 维护修改后生成的代码 STM32CubeMX 生成代码,会剔除它们提供的某些特殊部分之外的所有内容。...曾经,我们试图确保对生成的代码所做的所有编辑会出现在这些部分中,从某些代码结构就可以看出来。 但是随着时间的流逝,我们意识到这将很难实现,因此,需要重新生成代码,我们利用git来进行管理。

2.5K30

android root 缺少busybox,手机安装不了Busybox已经root安装后显示让更换路径..「建议收藏」

下载交叉编译工具: GNU Toolchain for ARM Processors 其中第一项选择ARM EABI或ARM GNU/Linux,第二项选择IA32 GNU/Linux TAR即可。...4 执行make编译源码. 如果编译过程中产生无法找到头文件的错误, 可指定交叉编译器用到的头文件所在路径. 如 $make -I....这样,就不用每次使用busybox提供的一个命令, 都要在前面加上busybox了. 11 修改/init.rc文件设置环境变量....4 执行make编译源码. 如果编译过程中产生无法找到头文件的错误, 可指定交叉编译器用到的头文件所在路径. 如 $make -I....这样,我们就不用每次使用busybox提供的一个命令, 都要在前面加上busybox了. 11 修改/init.rc文件设置环境变量.

2.5K10

【C++】基础:代码编译与构建工具介绍

常用的构建工具包括: MakeGNU 的构建工具,使用 Makefile 文件描述构建规则。 CMake:跨平台构建工具,使用 CMakeLists.txt 文件描述构建规则。...常用编译工具 gcc GCC(全称GNU Compiler Collection):是一种多平台编译器,由GNU开发,最初用于编译C语言(GNU C Compiler)。...调试器,是Unix下的调试工具,可以用于: 给程序设置断点; 程序停在断点处,查看变量、寄存器的值; 程序停在断点处,还能在不改变源代码的情况下改变这些值; gcc hello.c -d 3....makefile文件行,执行make all这个命令后make会根据makefile中的命令进行编译。...cmake 在大型工程的编译,一版使用cmake,对应的编译文件是CMakeList.txt。

13710

【Linux】《how linux work》第十六章 从 C 源代码编译软件入门

在解压之前,使用 tar tvf 或 tar ztvf 命令验证归档文件的内容,因为有些软件包在你解压归档文件的目录中不会创建自己的子目录。...目标文件以.o或二进制文件结尾。通常,在源代码分发中不会有任何目标文件,但在罕见情况下,软件包维护者无权发布某些源代码,您可能会发现一些目标文件,这时您需要采取一些特殊措施才能使用这些目标文件。...使用 --pkgname=name 选项为你的新包指定一个特定的名称。...For example, to make the preprocessor search in include_dir, run this command: configure不知道在哪里查找第三方包含文件和库...查看源代码、进行更改并创建自己的软件并不困难,这是迈向下一步的重要步骤。欢迎关注笔者公众号“懒小窝”获取更多内容。

8310

数据库PostrageSQL-从源代码安装

编译PostgreSQL需要下列软件包: 要求GNU make版本3.80或以上;其他的make程序或更老的GNU make版本将不会工作(GNU make有时以名字gmake安装)。...自旋锁支持的缺乏会导致较差的性能,因此这个选项只有当编译终端或者通知你该平台缺乏自旋锁支持应被使用。...在后端退出,将会创建一个子目录,其中包含用于性能分析的gmon.out文件。这个选项只用于 GCC和做开发工作。...但是,非零的优化级别会使调试更复杂,因为在编译好的代码中步进通常将不能和源代码行一一对应。如果你在尝试调试优化过的代码觉得困惑,将感兴趣的特定文件使用-O0编译。...你可以使用make install-strip代替make install, 在安装可执行文件和库文件把它们剥离。 这样将节约一些空间。

4.1K40

CMake学习笔记合集

—–高级编译配置工具 多个人用不同的语言或者编译器开发一个项目,最终要输出一个可执行文件或者共享库(dll,so等等)这时候神器就出现了—–CMake!...最关键的是,它自动生成了Makefile. 4、使用make命令编译 root@localhost cmake]# make Scanning dependencies of target hello...子目录加入工程并指定编译输出(包含编译中间结果)路径为bin 目录 如果不进行 bin 目录的指定,那么编译结果(包括中间结果)都将存放在build/src 目录 更改二进制的保存路径 SET...make install 安装 一种是打包的指定 目录安装。...静态库在编译时会直接整合到目标程序中,编译成功的可执行文件可独立运行 动态库在编译不会放到连接的目标程序中,即可执行文件无法单独运行。

2.2K20

CMake学习笔记

—–高级编译配置工具 多个人用不同的语言或者编译器开发一个项目,最终要输出一个可执行文件或者共享库(dll,so等等)这时候神器就出现了—–CMake!...最关键的是,它自动生成了Makefile. 4、使用make命令编译 root@localhost cmake]# make Scanning dependencies of target hello...子目录加入工程并指定编译输出(包含编译中间结果)路径为bin 目录 如果不进行 bin 目录的指定,那么编译结果(包括中间结果)都将存放在build/src 目录 更改二进制的保存路径 SET...make install 安装 一种是打包的指定 目录安装。...静态库在编译时会直接整合到目标程序中,编译成功的可执行文件可独立运行 动态库在编译不会放到连接的目标程序中,即可执行文件无法单独运行。

2.1K20

qmake:变量手册

默认情况下,使用编译器默认值。 thread:启用线程支持。 CONFIG 包含 qt 启用此功能,这是默认设置。 no_utf8_source:指定项目的源文件使用 UTF-8 编码。...这些选项定义 Windows 上的特定功能: flat:使用 vcapp 模板,这会将所有源文件放入源组并将头文件放入头组,而不管它们驻留在哪个目录中。...此变量特定于 .vcproj 文件; 否则将被忽略。 29、HEADERS 定义项目的头文件。...no_build:进行 make install 并且还没有构建项目,首先构建项目,然后安装。 如果不希望出现此行为,请设置此配置值以确保不会将构建目标添加为安装目标的依赖项。...如果您需要更改用于特定平台或项目类型的标志,请使用专用变量之一来代替此变量。 101、QMAKE_LFLAGS_CONSOLE 此变量仅在 Windows 上使用

3.7K20

Autoconf 详解

在 configure进行它的测试,本变量没有被定义,只有在创建输出文件时候定义。关于如何检查从前的测试结果,请参见 设定输出变量。...在一些老的BSD系统中,touch或者任何可能导致空文件的命令不会更改时间标记,所以使用诸如echo 之类的命令。...对特定函数的检查 这些宏用于检测特定的C函数–它们是否存在,以及在某些情况下,给出了特定的参数,它们是如何响应的。 宏: AC_FUNC_ALLOCA 检测如何获得 alloca。...configure接受选项`–cache-file=file‘以使用不同的缓存文件;这就是configure在调用子目录中的configure脚本所作的工作。...由于Autoconf定义的宏的长度,UNIX m4开始失败(dump core),同时也发现了GNU m4中的一些bug。最终,我们意识到我们需要使用一些只有 GNU m4提供的特征。

3.8K50

libxml2剖析(2):编译

编译Libxml2无需任何其他的库,正常的C ANSI API就足够了。然而在配置如果libxml2检测到以下库将会使用它们:      libz: 一个高可移植的、使用广泛的压缩库。      ...关于libiconv库,参见http://www.gnu.org/software/libiconv/。      安装好之后,应用程序在进行编译和链接需要知道libxml2的头文件和库文件位置。...Libiconv是GNU的字符编码转换库,使用LGPL许可,我们需要把它编译成动态链接库。...(2)编译libiconv      根据官方http://www.gnu.org/software/libiconv/的描述,libiconv和libcharset库以及它们的头文件使用LGPL授权,...之后可以在libiconv-1.14\include\下看到生成的头文件iconv.h,在libiconv-1.14\lib\.libs\下看到编译好的libiconv-2.dll,但因为使用GNU GCC

2K20

【GUN和Linux到底是什么关系,gcc,make,cmake,yum是什么】

2.当你的程序只有一个源文件,直接就可以用gcc命令编译它。...3.但是当你的程序包含很多个源文件,用gcc命令逐个去编译,你就很容易混乱而且工作量大 4.所以出现了make工具 make工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能,而是用类似于批处理的方式...13.make是一个简单的通过文件时间戳控制自动过程、处理依赖关系的软件,这个自动过程可以是编译一个项目。...一些 GNU 组件 [3]需要大量更改才能与 Linux 一起使用。将一个完整的系统集成为一个“开箱即用”的发行版也是一项艰巨的工作。...您谈论这种组合时,请称其为“GNU/Linux”。

1.8K40

整合Xilinx PetaLinux工程编译和Open Source U- BootLinux编译

完整的一次PetaLinux/Yocto编译,可能需要从网络下载上GB的文件,可能需要几个小时。即使只更改一行代码,也需要数分钟时间。...PetaLinux/Yocto的编译流程,也和很多开发人员原来的基于make的工作方法不一样,它会分析文件系统里所有应用程序的配置文件,执行下载、配置、编译、打包等过程。...这样使用make xilinx_peta_defconfig,可以创建PetaLinux使用的Linux配置。...fit-image-petalinux-user-image.its使用了build下的层次很深的子目录来指定文件。为了方便,可以修改为使用images/linux下的文件。...同样更改使用外部Linux源代码编译,并创建image.ub,只耗时8秒钟。 5.6.

3.7K10

抛弃 Autotools 向 CMake 迈进吧

接下来,使用系统上的 make 命令(在 Linux 上是 GUN Make,在 NetBSD 上是 NetBSD Make)来编译程序。这个过程通常是将人类可读的源代码转换成机器语言。...最后,在 make install 一步中,那些编译过的文件将被拷贝到(在 cmake 步骤中扫描出来的)计算机上合适的位置。 这看起来很简单,当你使用 CMake 就是这样。...但是在这个例子中,你需要使用 TARGET 命令来指定你要安装文件的名字。...你可以使用与包含编译文件类似的工作流程,将任意数据包含在 CMake 项目中:在 CMakelists.txt 文件使用 file 命令,然后说明一下这些文件要安装在哪里。...DIRECTORY 参数指定了数据文件是一个目录,而不是一个文件(FILE)或者脚本(SCRIPT)。你使用的参数和复制一些额外文件编译目录是一样。

41720
领券