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

尽管使用了对象文件,GNU make仍会重新编译

的原因是因为GNU make是一个基于依赖关系的构建工具,它通过检查目标文件和依赖文件的时间戳来确定是否需要重新编译。当目标文件的时间戳早于依赖文件的时间戳时,GNU make会认为目标文件已过期,需要重新编译。

对象文件是编译源代码生成的中间文件,它包含了编译器将源代码转换为机器代码的结果。当源代码发生变化时,编译器会重新编译源代码生成新的对象文件。然而,即使源代码没有发生变化,GNU make仍然会重新编译对象文件的原因有以下几点:

  1. 依赖文件的时间戳发生变化:如果源代码依赖的文件发生了变化,例如头文件被修改,那么依赖文件的时间戳会更新。GNU make会检查依赖文件的时间戳,发现它们比目标文件的时间戳更新,就会重新编译目标文件。
  2. 编译选项发生变化:如果编译源代码时使用了不同的编译选项,例如优化级别或者编译器版本,那么生成的对象文件也会不同。GNU make会检查编译选项是否发生变化,如果发生变化就会重新编译目标文件。
  3. 清理操作:如果执行了清理操作,删除了目标文件或者中间文件,GNU make会认为目标文件不存在,需要重新编译。

总结起来,尽管使用了对象文件,GNU make仍会重新编译的原因是源代码或者依赖文件发生了变化,或者编译选项发生了变化,或者执行了清理操作。这是为了确保生成的目标文件是最新的,以保证软件的正确性和可靠性。

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

  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云容器服务(TKE):https://cloud.tencent.com/product/tke
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(IoT):https://cloud.tencent.com/product/iot
  • 腾讯云移动开发(Mobile):https://cloud.tencent.com/product/mobile
  • 腾讯云数据库(TencentDB):https://cloud.tencent.com/product/cdb
  • 腾讯云区块链(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云元宇宙(Metaverse):https://cloud.tencent.com/product/metaverse
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

CMake vs Make对比

程序员现在已经使用了CMake和Make了很久。当您加入大公司或开始使用大型代码库开发项目时,您需要处理所有这些构建。你必须看到这些“CMakeLists.txt”文件浮动。...为什么我们需要“Make”? 我们需要“Make”的原因是因为它使最终用户能够构建和安装您的软件包,而无需了解其操作的详细信息。...根据哪些源文件已更改,“自动”自动显示需要更新的文件。它还自动确定更新文件的正确顺序,以防一个非源文件依赖于另一个非源文件。 每当我们改变系统的一小部分时,重新编译整个程序将是低效的。...因此,如果您更改了一些源文件,然后运行“Make”,它不会重新编译整个事情。它仅更新直接或间接依赖于您更改的源文件的那些非源文件。很整洁!“Make”不限于任何特定语言。...这些shell命令可以运行一个编译器来产生一个对象文件,链接器生成一个可执行文件,以便更新一个库,Makeinfo格式化文档等。“Make”不仅限于构建一个包。

4K31

linux下make命令的使用方法

现在,假设你对某个源文件进行了修改,你再次执行 make 命令,它将只编译与该源文件相关的目标文件,因此,编译完最终的可执行文件节省了大量的时间。...假设你对 test.c 文件做了一些修改,重新使用 make 编译工程: $ makegcc -c -Wall test.c gcc -Wall test.o anotherTest.o -o test...你可以看到只有 test.o 重新编译了,然而另一个 Test.o 没有重新编译。...通过 -B 选项让所有目标总是重新建立 到目前为止,你可能注意到 make 命令不会编译那些自从上次编译之后就没有更改的文件,但是,如果你想覆盖 make 这种默认的行为,你可以使用 -B 选项。...make 命令不会编译任何文件,然而 make -B 会强制编译所有的目标文件以及最终的执行文件

3.5K20
  • Linux下的make命令用法

    现在,假设你对某个源文件进行了修改,你再次执行 make 命令,它将只编译与该源文件相关的目标文件,因此,编译完最终的可执行文件节省了大量的时间。...,假设你对 test.c 文件做了一些修改,重新使用 make 编译工程: $ make gcc -c -Wall test.c gcc -Wall test.o anotherTest.o -o...test 你可以看到只有 test.o 重新编译了,然而另一个 Test.o 没有重新编译。...通过 -B 选项让所有目标总是重新建立 到目前为止,你可能注意到 make 命令不会编译那些自从上次编译之后就没有更改的文件,但是,如果你想覆盖 make 这种默认的行为,你可以使用 -B 选项。...make 命令不会编译任何文件,然而 make -B 会强制编译所有的目标文件以及最终的执行文件

    17.4K41

    关于编译的重要概念总结

    gcc调用了C compiler,而g++调用了C++ compiler gcc和g++的主要区别 对于 .c和.cpp文件,gcc分别当做c和cpp文件编译(c和cpp的语法强度是不一样的)...,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,也可以执行操作系统的命令。...make是一个命令工具,它解释Makefile 中的指令。在Makefile文件中描述了整个工程所有文件编译顺序、编译规则。Makefile 有自己的书写格式、关键字、函数。...那么cmake为了解决这个问题而诞生了,其允许开发者指定整个工程的编译流程,在根据编译平台,生成本地化的Makefile和工程文件,最后用户只需make编译即可。...简而言之,可以把cmake看成一款自动生成 Makefile 的工具,所以编译流程就变成了:cmake—>make–>用户代码–>可执行文件

    94720

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

    Ritchie (Prentice Hall, 1988): 大多数Unix系统上的C编译器可执行文件GNU C编译器gcc,尽管来自LLVM项目的较新的clang编译器正在变得越来越受欢迎。...包含文件。#include指令指示预处理器包含整个文件。 注意,编译器的-I选项实际上是一个选项,它使预处理器在指定的目录中搜索包含文件,就像你在前面的部分中看到的那样。...当你移动库文件时,如果没有程序的源代码,无法使用patchelf,或者你懒得重新编译可执行文件,这是一种廉价的方法使程序工作。 不幸的是,一分钱一分货。...再次运行 make。这次,make 确定 aux.c 比目录中已存在的 aux.o 新,因此会重新编译 aux.o。...注意 如果需要为对象文件定义特殊规则,请将对象文件的规则放在构建可执行文件的规则的上方。 如果多个可执行文件使用同一对象文件,则应将对象规则置于所有可执行文件规则之上。 置于所有可执行文件规则之上。

    9810

    使用全志方案遇到glibc库版本低以及编译报错的解决方法

    Glibc 包含了linux一些主要的C库,用于分配内存、搜索目录、打开关闭文件、读写文件、字串处理、模式匹配、数学计算等,在遇到glibc库版本低编译还报错的情况时,遵循以下步骤解决 参考文章:如何编译...假如服务器make版本较高,可以不用更新make工具。 网址 http://ftp.gnu.org/pub/gnu/make ,下载最新版本4.3。解压后,对make工具进行安装。...第4行是gcc位置,第5行是make工具位置(不需要安装高版本make可以去掉),第7行是glibc版本,第12行是glibc源码路径,第13行是glibc生成库文件路径,第14行是glibc编译过程产生中间文件存放路径.../env.sh 注意下信息,我们可以看到glibc生成准备环境时候,已经使用了我们指定gcc工具链,make工具。...编译完成后,我们看到对应so库 替换glibc,例如在我们测试demo,修改Makefile,指定到我们glibc版本路径即可 重新编译,查看对应执行文件,看到已经使用对应版本版本glibc库 strings

    75910

    使用 Makefile 管理和部署 Go 项目

    Makefile 尽管是一个历史悠久的工具,但它在任务管理和自动化方面的能力依然不可小觑。对于 Go 语言项目来说,利用 Makefile 来管理和自动化构建、部署过程能极大地简化开发流程。...Makefile 提供了一个中心化的脚本集合,用于自动化执行各种任务,如编译源代码、打包软件、清理临时文件、部署到服务器等。...Makefile 基础Makefile 是一个特殊格式的文件,它被 make 工具使用来管理和自动化软件的构建过程。每个 Makefile 包含一系列的规则和依赖,make 根据这些规则来执行任务。...这意呤着即使在当前目录下存在与任务同名的文件,执行 make 时,仍会执行该任务。这个声明可以避免由于存在同名文件而导致的任务不被执行。...执行任务要运行上面定义的 deploy-dev 任务,只需要在项目根目录下运行以下命令:make deploy-dev这条命令会依次执行构建可执行文件、上传至服务器、停止服务、替换新文件重新启动服务等一系列操作

    7710

    全志Tina Linux下如何编译glibc库

    假如服务器make版本较高,可以不用更新make工具。 网址 http://ftp.gnu.org/pub/gnu/make ,下载最新版本4.3。解压后,对make工具进行安装。.../configure --prefix=${path} make make install 安装完成,我们看到make 4.3版本 glibc源码下载 网址 http://ftp.gnu.org/pub...第4行是gcc位置,第5行是make工具位置(不需要安装高版本make可以去掉),第7行是glibc版本,第12行是glibc源码路径,第13行是glibc生成库文件路径,第14行是glibc编译过程产生中间文件存放路径.../env.sh 注意下信息,我们可以看到glibc生成准备环境时候,已经使用了我们指定gcc工具链,make工具。...编译完成后,我们看到对应so库 替换glibc,例如在我们测试demo,修改Makefile,指定到我们glibc版本路径即可 重新编译,查看对应执行文件,看到已经使用对应版本版本glibc库 strings

    19610

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

    下载交叉编译工具: GNU Toolchain for ARM Processors 其中第一项选择ARM EABI或ARM GNU/Linux,第二项选择IA32 GNU/Linux TAR即可。...最后得到一个arm-2007q3-51-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2文件 将压缩包解压到linux下某个目录, 并设置好环境变量, 使之能找到前缀为...4 执行make编译源码. 如果编译过程中产生无法找到头文件的错误, 可指定交叉编译器用到的头文件所在路径. 如 $make -I....最后得到一个arm-2007q3-51-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2文件 将压缩包解压到linux下某个目录, 并设置好环境变量, 使之能找到前缀为...4 执行make编译源码. 如果编译过程中产生无法找到头文件的错误, 可指定交叉编译器用到的头文件所在路径. 如 $make -I.

    2.6K10

    Linux下编译安装源代码的三个步骤

    Linux下编译安装源代码无非就是三个步骤,./configure,make,make install 第一步进入源代码的目录 运行命令 1 ....此选项阻止'configure'生成这个文件。你可以认为这是一种演习(dry run),尽管缓存(cache)仍然被改写了。...--oldincludedir=DIR 指定为除GCC外编译器安装的C头文件的安装位置。 --infodir=DIR 指定Info格式文档的安装位置.Info是被GNU工程所使用的文档格式。...make的使用 一般情况下,只需要直接用make即可,但是有时候,生成的Makefile文件中并没有指定C编译器或者C++编译器,那么就需要手动指定了,不然就有可能出现编译错误。...make CC=指定C语言编译make CXX=指定C++编译器 最后就简单了 使用make install即可。

    1.9K20

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

    常用的构建工具包括: MakeGNU 的构建工具,使用 Makefile 文件描述构建规则。 CMake:跨平台构建工具,使用 CMakeLists.txt 文件描述构建规则。...常用编译工具 gcc GCC(全称GNU Compiler Collection):是一种多平台编译器,由GNU开发,最初用于编译C语言(GNU C Compiler)。...常用构建工具 make make工具相当于一个批处理工具,本身没有编译和链接的功能,而是用类似于批处理的方式通过调用makefile文件中用户指定的编译命令(如gcc、g++)来进行编译和链接(当作批处理工具用就行...makefile文件才行,执行make all这个命令后make会根据makefile中的命令进行编译。...CMake可以生成Makefile或Visual Studio项目文件等,使开发人员可以在不同的平台和编译器上使用相同的配置文件进行构建。

    16210

    怎样在 Linux 中使用动态和静态库

    另外一个值得注意的地方是,当一个共享库的 bug 被修复后,所有引用了这个库的应用都会受益。...尽管这不是一个每天都会遇到的问题,但是理解动态链接的原理总是有助于你修复类似的问题。 幸运的是,动态链接的机制其实非常简洁明了。...ld.so 按以下顺序在这些地方寻找共享对象: 应用的绝对路径或相对路径下(用 GCC 编译器的 -rpath 选项硬编码的) 环境变量 LD_LIBRARY_PATH /etc/ld.so.cache...编辑 makefile(第 10 行)然后通过 make -B 来重新编译程序。然后 ldd 输出显示 libmy_shared.so 和它的绝对路径一起被列出来了。...Werror -Wl,-rpath,$(shell pwd) 改成这个(记得修改用户名): CFLAGS =/home/stephan/library_sample/libmy_shared.so 然后重新编译

    2K21

    Linux 之父如何定义 Linux?

    因此你不能在不发布他们源码的情况下重新发布他们,可以在/pub/GNU中找到。关于GNU非盈利性版权,从任何GNU软件包了解更多。...通过这个你可以使用系统独立库源码编译一个大一些的库。· utilbin.tar.Z–各种GNU工具的二进制文件,包括GNU的fileutils,make和tar。也包含克隆emacs的uemacs。..., strip, ranlib)· GNU compress (16-bit)· GNU tar· GNU make· GNU bash (Bourne Again SHell)· GNU sed· GNU...因此你不能在不发布他们源码的情况下重新发布他们,可以在/pub/GNU中找到。关于GNU非盈利性版权,从任何GNU软件包了解更多。...通过这个你可以使用系统独立库源码编译一个大一些的库。 · utilbin.tar.Z–各种GNU工具的二进制文件,包括GNU的fileutils,make和tar。

    15.1K20

    解决make编译链接动态库错误:libxx.so: undefined reference to xx

    int main( int argc, char ** argv ) { printf( "exit\n" ); return 0; } 接着使用make命令编译链接生成目标ELF...也就是tst.c中是一个及其普通的程序,与libsrcpbl.so中的数据完全没关系,但是还是报出同样的错误: [root@typecodes test]# make gcc -std=c99 -D_GNU_SOURCE...make一下,链接生成ELF文件成功!...4 总结 在make编译链接某个动态库lxx.so时,如果报libxx.so: undefined reference to xx的话,很可能是由下面两种原因引起的。...1、链接的动态库中存在只做了声明的自定义的函数/全局变量,但是在其它对象文件中没有实现定义; 2、链接生成的目标文件中引用了某动态库的自定义函数/全局变量,但是没有通过`-lXX`选项链接进来。

    97510
    领券