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

当源文件位于不同的目录中时,如何编写makefile?

当源文件位于不同的目录中时,可以通过编写适当的makefile来管理和构建项目。下面是一种常见的方法:

  1. 首先,需要定义变量来表示源文件和目标文件的路径。例如,假设源文件位于src目录中,目标文件位于build目录中,可以定义以下变量:
  2. 首先,需要定义变量来表示源文件和目标文件的路径。例如,假设源文件位于src目录中,目标文件位于build目录中,可以定义以下变量:
  3. 接下来,需要定义一个规则来指定如何生成目标文件。可以使用通配符来匹配源文件,然后使用相应的规则来生成目标文件。例如,假设源文件的扩展名为.c,可以使用以下规则:
  4. 接下来,需要定义一个规则来指定如何生成目标文件。可以使用通配符来匹配源文件,然后使用相应的规则来生成目标文件。例如,假设源文件的扩展名为.c,可以使用以下规则:
  5. 其中,$(CC)表示编译器,$(CFLAGS)表示编译选项,$<表示依赖文件(源文件),$@表示目标文件。
  6. 然后,需要定义一个目标来指定如何生成最终的可执行文件。可以列出所有的目标文件,并使用相应的规则来生成可执行文件。例如,假设最终的可执行文件名为app,可以使用以下规则:
  7. 然后,需要定义一个目标来指定如何生成最终的可执行文件。可以列出所有的目标文件,并使用相应的规则来生成可执行文件。例如,假设最终的可执行文件名为app,可以使用以下规则:
  8. 其中,$^表示所有的依赖文件(目标文件),$@表示目标文件(可执行文件)。
  9. 最后,可以定义一些辅助规则,如清理规则和默认规则。清理规则用于删除生成的目标文件和可执行文件,可以使用以下规则:
  10. 最后,可以定义一些辅助规则,如清理规则和默认规则。清理规则用于删除生成的目标文件和可执行文件,可以使用以下规则:
  11. 默认规则用于指定默认的目标,可以使用以下规则:
  12. 默认规则用于指定默认的目标,可以使用以下规则:
  13. 这样,在运行make命令时,会自动执行默认规则,生成最终的可执行文件。

以上是一个简单的makefile示例,可以根据实际情况进行修改和扩展。请注意,这只是一种常见的方法,实际的makefile可能会根据项目的需求和结构有所不同。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

编写一个爬虫的思路,当遇到反爬时如何处理

开章明义,当遇到反爬机制时,想要做到把数据爬下来,无非四个方法: 加代理 降速度 破解接口 多注册几个账户 好多文章为了显示自己高大上,吹些什么高并发呀,分布式,机器学习破解验证码的幺蛾子,都是扯淡。...我们知道计算机程序按瓶颈不同大概分为两类,CPU 密集型和 IO 密集型。CPU 密集型就是偏重计算的任务,比如说编解码啥的;IO 密集型就是偏重于网络的任务,比如说下载或者 web 服务器。...**作为一个合格的爬虫编写者,你肯定已经擅长伪造各种 HTTP headers, 破解 JS 的加密参数,但是唯独一个 -- 来源 IP -- 你是无法伪造的。...拿到抓取任务时的思路 言归正传,我们开始说当拿到一个站点需要爬取时该如何处理。 数据量较小的爬取 首先开始 easy 模式。如果你要抓的网站结构比较简单,而你要的数据也比较少。...那么你首先要考虑的是不要编写爬虫. 在浏览器控制台里写个 js 表达式 console.log 一下说不定就把数据导出来了。

80920
  • Makefile教程

    6.多源文件目录的简单模板 通过上面简单示例可以大致了解Makefile的基本编写方法与内容,实际上,Makefile可以通过make自动推导特性、内置变量、自动化变量和函数等编写地更加简洁优雅,并且可以模板化...自动推导功能和自动化变量,用一条语句实现同一个目录下多个源文件的编译 #根据多个源文件目录添加多个,注意不同目录下的源文件不能重名 ${DIR_OBJ}/%.o:${DIR_SRC0}/%.cpp...& $(MAKE) 解释:当生成target目标对象时,会执行$(MAKE) -C $(SUBDIR)这条命令,进入目录OBJDIR,该目录下有一个Makefile,并执行。...(2)当Makefile内嵌shell脚本时,Makefile中每一行的shell脚本需要一个shell进程来执行,不同行之间变量值不能传递。所以,Makefile中的shell不管多长也要写在一行。...尤其是在Makefile中,当变量定义或者函数调用时,通配符%的展开功能就失效了。此时需要借助wildcard函数。通配符*常用于wildcard函数中,二者应用范围不同。

    4.1K53

    CMake vs Make对比

    “Make”是从程序的源文件中控制程序的可执行文件和其他非源文件的生成工具。 “Make”工具需要知道如何构建程序。它了解如何从名为“makefile”的文件构建程序。...这个makefile列出了每个非源文件以及如何从其他文件中计算它。编写程序时,应该为其编写一个makefile,以便可以使用“Make”来构建和安装程序。简单的东西!...这就是我们有这个makefile的原因。构建过程的细节实际上记录在您提供的makefile中。根据哪些源文件已更改,“自动”自动显示需要更新的文件。...对于程序中的每个非源文件,makefile指定了用于计算它的shell命令。...当然,当第三方库(如OpenGL)以便携式的方式被包含时,CMake真的开始闪耀。 有什么不同? 如果您使用Makefile,即在命令行中键入“make”,则构建过程有一个步骤。

    4.1K31

    cmake 简介2021-10-03

    build,与in-source build相对,即将编译输出文件与源文件放到不同目录中; 三、 基本结构 1,依赖CMakeLists.txt文件,项目主目标一个,主目录中可指定包含的子目录...build,与in-source build相对,即将编译输出文件与源文件放到不同目录中; 三、 基本结构 1,依赖CMakeLists.txt文件,项目主目标一个,主目录中可指定包含的子目录...图 1. camke 的运行结果 处理多源文件目录的方法 CMake 处理源代码分布在不同目录中的情况也十分简单。现假设我们的源代码分布情况如下: 图 2....处理多源文件目录时 cmake 的执行结果 在执行 cmake 的过程中,首先解析目录 step2 中的 CMakeLists.txt ,当程序执行命令 ADD_SUBDIRECTORY( src...处理多源文件目录时 cmake 的执行结果 在执行 cmake 的过程中,首先解析目录 step2 中的 CMakeLists.txt ,当程序执行命令 ADD_SUBDIRECTORY( src

    36320

    Makefile学习1

    linux下编写程序,因为早期没有成熟的IDE,一般都是使用不同的命令进行编译:将源文件分别使用编译器、汇编器、链接器编译成可执行文件,然后手动运行。...文件,例如当项目中需要添加更多的源文件时,你只需要更改OBJS的值就可以了。...比如hello.c,当匹配模式为%.c时,$*表示hello $(@D):表示目标文件的目录部分 $(@F):表示目标文件的文件名部分 $(*D):在模式匹配中,表示目标模式中%的目录部分 $(*F):...递归执行 在实际工程项目中,各个源文件通常存放在各个不同的目录中,make在编译工程项目时,会依次遍历各个不同的子目录,编译每个子目录下的源文件。...,解析各个子目录下的Makefile并运行,遍历完所有的子目录 make依次遍历到各个子目录下解析新的Makefile时,项目顶层目录的主Makefile定义的一些变量,如何传递到子目录的Makefile

    39510

    可移植的 Makefile 教程

    我已经对 make 官方规范 十分熟悉,并且在过去的一年,我都在严格要求自己编写可移植的 Makefile。...只有一个意外:在 Makefile 中,第一个非特殊的目标会被认为是 默认目标(default target)。当调用 make 但是没有并没有指定一个目标时,这个默认目标就会被自动选择。...如果你打算创建示例中的源文件,并调用 make, 你会发现它实际上已经知道了它该如何构建目标文件。...你可能需要告诉你的编辑器如何做到这一点。 当涉及子目录下的文件时,在名字中包含子目录即可。所有 make 关心的内容都会跟之前一样正常工作,包括推断规则。...有很多教程讲述了如何在构建时同时生成依赖,但是它很脆弱和缓慢。最好是在一次性完成,在 Makefile 中写好依赖,以便于 make 能够如期工作。

    1.4K10

    Linux从入门到入土③(GCC、静态与动态链接库、Git、Make、Makefile)

    静态库与动态库的区别静态库的代码在编译时就拷⻉到应⽤程序中,因此当有多个程序同时引⽤⼀个静态库函数时,内存中将会调⽤函数的多个副本。由于是完全拷⻉,因此⼀旦连接成功,静态库就不再需要了,代码体积⼤。...动态库在程序内留下⼀个标记,指明当程序执⾏时,⾸先必须要载⼊这些库。在程序开始运⾏后调⽤库函数时才被载⼊,被调⽤函数在内存中只有⼀个副本,代码体积⼩。...:例如我们现在有一个文件夹结构如下:图片在这个目录中有几个关于算法的源文件:add.c:加法源文件div.c:除法源文件mult.c:乘法源文件sub.c:减法源文件这每一个源文件里面都对应着不同的算法函数...makefile 文件,分别位于不同的项目目录中==。...makefile 中的变量是没有类型的,直接创建变量然后给其赋值就可以了。创建变量之后一定要赋值在给 makefile 中的变量赋值之后,如何在需要的时候将变量值取出来呢?# 如何将变量的值取出?

    1.6K10

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

    当C语言工程很大,源码非常多时,如果还去使用GCC命令编译程序,几乎是不现实的。这时候,可以通过编写shell脚本去执行编译命令,当然这并不是一种好的方式。...简单说,以前我们编写的C语言编译脚本是不能跨平台编译的,例如上面示例中编写的 Makefile ,它只能在GCC环境下编译,通常是Linux系统上,而在Windows下的Visual Studio里面就没法用...cmake -G "MinGW Makefiles" 要注意,以上命令直接在CMD命令行执行可能会报错,它需要一个sh环境,这里有两种解决办法 将sh.exe所在目录加入到环境变量中,它位于MinGW...目录中,包括Makefile,然后执行make编译。...文件,然后执行make命令进行编译,完成后build目录下即生成main.exe 当链接已经编译好的库时,推荐使用find_library来查找库,因为link_directories命令传入相对路径时

    3.1K30

    Linux下automake工具使用(自动构建Makefile文件)

    一、前言 linux环境下,当项目工程很大的时候,编译的过程很复杂,所以需要使用make工具,自动进行编译安装,但是手写makefile文件比较复杂,所幸在GNU的计划中,设计出了一种叫做Autoconf...但是如果通过查阅make的帮助文档来手工编写Makefile,对任何程序员都是一场挑战。...1) flat指的是所有文件都位于同一个目录中。 就是所有源文件、头文件以及其他库文件都位于当前目录中,且没有子目录。Termutils就是这一类。...2) shallow指的是主要的源代码都储存在顶层目录,其他各个部分则储存在子目录中。 就是主要源文件在当前目录中,而其它一些实现各部分功能的源文件位于各自不同的目录。...3) deep指的是所有源代码都被储存在子目录中;顶层目录主要包含配置信息。 就是所有源文件及自己写的头文件位于当前目录的一个子目录中,而当前目录里没有任何源文件。

    8.1K31

    用python写makefile

    温馨提示:阅读本文的同学最好能了解makefile和python的编写规则。不懂的同学可以先保存在收藏夹,以便日后查看。...所以最近花了几个晚上了解makefile的编写规则。 开始的时候,我参照网上一些makefile的例子,写了一个初版的makefile。然而这个makefile在编译我的工程的时候报错。...2、不同的.o文件或不同的.cpp文件处于不同的目录下。 这时我找到两种解决方法: 1、就是用VPATH这个特殊变量,但是我不可能将所有要包含的目录都一一手动包含进来,于是我放弃。...因为之前遇到这个困难时,我特意去了解Qt生成的makefile(其实这个makefile是依据.pro工程文件生成的)。而这个makefile正是将所有的编译规则都列举出来。...通过遍历之前设定的工程工作目录,调用SearchFiles遍历该目录下所有的源文件(.cpp),及设定目标文件(.o)的绝对路径,最终是tuple的形式保存到OBJ2SRC数组中;还有的是将所有源文件保存在

    6.3K40

    手把手教你写一个 Makefile 文件

    一、了解什么是 Makefile 一个大型工程中的源文件不计其数,各个功能或者模块分别放在不同的目录下,手动敲命令去编译就带来很大的麻烦,那么Makefile可以定义一系列的编译规则,哪些文件需要先编译...编写完成后,执行make命令,make会在当前目录下找到名字为Makefile或makefile的文件,程序就会自动运行,产生相应的中间文件和可执行文件 a....那么Makefile是如何判断文件是否有修改过呢?...、目标文件和可执行文件,分别放在不同的目录中,由Makefile统一管理这些文件,将生产的目标文件放在目标目录下,可执行文件放到可执行目录下,分类目录如下图: bin目录:放可执行文件 include...目录:放头文件 obj目录:放中间目标文件 src目录:放源文件 可见原来那些文件都不在同一目录下了,那么这时候如果还用之前的Makefile,make就没法处理了,自动推导也会无法进行,就需要改成如下

    1.6K10

    Python中使用deepdiff对比json对象时,对比时如何忽略数组中多个不同对象的相同字段

    最近忙成狗了,很少挤出时间来学习,大部分时间都在加班测需求,今天在测一个需求的时候,需要对比数据同步后的数据是否正确,因此需要用到json对比差异,这里使用deepdiff。...一般是用deepdiff进行对比的时候,常见的对比是对比单个的json对象,这个时候如果某个字段的结果有差异时,可以使用exclude_paths选项去指定要忽略的字段内容,可以看下面的案例进行学习:...上面的代码是一般单条数据对比的情况。...从上图可以看出,此时对比列表元素的话,除非自己一个个去指定要排除哪个索引下的字段,不过这样当列表的数据比较多的时候,这样写起来就很不方便,代码可读性也很差,之前找到过一个用法,后来好久没用,有点忘了,今晚又去翻以前写过的代码记录...这里对比还遇到一个问题,等回头解决了再分享: 就这种值一样,类型不一样的,要想办法排除掉。要是小伙伴有好的方法,欢迎指导指导我。

    91520

    【Linux探索学习】第九弹——Linux工具篇(四):项目自动化构建工具—makeMakefile

    简单点来说make是一个命令,Makefile是当前目录下的一个文件 二、如何使用make/Makefile 使用实例 为了方便我们下面的讲解,我们这里先带大家看一下如何使用make/Makefile来实现自动化构建的功能...首先,我们要先明白为什么要有这个自动化构建工具,在我们之前的学习中,我们在编写代码的时候会经常用到gcc和删除相关的指令,每次都需要我们重新创建并删除可执行文件,这个操作比较冗余,且当工程比较大时,这种操作就会显得非常麻烦...,所以就有了自动化构建工具 下面我们来看一下如何简单的使用make/Makefile 首先,我们要先在当前目录下创建一个Makefile文件 touch Makefile 然后进入这个文件中,将我们的源文件和目标文件建立依赖关系...-f mytest 写入后保存并退出,然后执行make命令 执行后我们就可以发现我们执行了Makefile文件中的编译命令,生成了可执行文件,运行可执行文件后就可以得到我们想要的结果 当我们要删除我们得到的这个可执行文件时...3、当源文件不变时,只能编译一次 我们来看这样一个现象: 当我们的源文件没有改动时,我们只能make编译一次,之后就无法再编译了,这样的原因其实是为了提高编译效率,那么make指令具体是怎么做的呢

    7610

    Linux不同共享库中同名函数的处理

    场景引入: 在一个尚未成熟的行业中,一般行业标准是先于国家标准。这就导致了开发人员需要做很多兼容工作,再就是会用到很多其他厂商提供的库与头文件,面对不同版本的标准,一般会更新库与头文件。...那么此时如果要兼容新库和旧库要做怎样的操作呢? ①当两个C语言共享库之间有同名函数,链接时会报错么? ②如果不报错,调用的顺序是如何确定的呢? ③如果我想兼容两个库,该如何操作呢?...libOne.c是源文件、libOne.c是源文件对应头文件、libOneTest.h是对外暴露的接口头文件。还有一个Makefile文件。 2....创建共享库与静态库Makefile文件的编写 ################################################################# #...一、小结 当两个共享库中有同名函数时,调用函数顺序取决于链接库顺序。

    3K10

    Makefile && CMake 简单入门

    ,就是当我们添加新的源文件到当前目录中的时候,我们也不需要去添加对应的 .o 文件!...,只不过要注意的是 在当前目录中!...CMake 一、简单语法 ​ 引入 cmake 是因为跨平台的原因,因为在不同平台中编写的 makefile 是不同的,所以就要有一个工具也就是 cmake 来解决! ​...这样,对于每个源文件,该规则都会生成对应的目标文件,并将其放到指定的目录中。 ​ 因此,第二个 Makefile 的规则更加准确和合理,可以正确地根据每个源文件生成对应的目标文件。...而第一个 Makefile 在处理多个源文件时存在问题,只会使用第一个源文件生成所有目标文件,这是不正确的。 ​ 所以,第二个 Makefile 是正确的形式,建议使用该形式来生成目标文件。

    7510

    6_Makefile与GCC

    当gcc在默认的路径中没有找到头文件时,就到本选项指定的目录中去找。在上面的例子中创建一个目录,然后创建一个头文件test.h。...注意:在命令行中,静态库夹在的库必须位于调用该库的目标文件之后。 6.2.2.4 代码优化选项 ​ gcc提供几种不同级别的代码优化方案,分别是0,1,2,3和s级,用-Olevel选项表示。...如果我们能够编写一个管理编译这些文件的工具,使用这个工具来描述这些源文件的编译,如何重新编译。为此“make”工具就此诞生。...不过上面的Makefile仍然有问题,就是工程中的源文件不断增加,如果按照上面的写法,你会发现,Makefile会越来越臃肿。下面我们讲解如何解决这个臃肿的问题。...6.4.3 Makefile的规则 6.4.3.1 命名规则: ​ 一般来说将Makefile命名为Makefile或makefile都可以,当很多源文件的名字是小些,所以一般使用Makefile。

    3.6K10
    领券