精华内容
下载资源
问答
  • make如何工作的

    2020-12-09 16:09:58
    make在当前目录下找名字叫“Makefile”或“makefile”的文件。 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“edit”这个文 件,并把这个文件作为最终的目标文件。 如果 edit ...

    在默认的方式下,也就是我们只输入 make 命令。那么,

    1. make 会在当前目录下找名字叫“Makefile”或“makefile”的文件。
    2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“edit”这个文
      件,并把这个文件作为最终的目标文件。
    3. 如果 edit 文件不存在,或是 edit 所依赖的后面的 .o 文件的文件修改时间要比 edit 这个文件新,
      那么,他就会执行后面所定义的命令来生成 edit 这个文件。
    4. 如果 edit 所依赖的 .o 文件也不存在,那么 make 会在当前文件中找目标为 .o 文件的依赖性,如
      果找到则再根据那一个规则生成 .o 文件。(这有点像一个堆栈的过程)
    5. 当然,你的 C 文件和 H 文件是存在的啦,于是 make 会生成 .o 文件,然后再用 .o 文件生成 make
      的终极任务,也就是执行文件 edit 了。
      这就是整个 make 的依赖性,make 会一层又一层地去找文件的依赖关系,直到最终编译出第一个目
      标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么 make 就会直接退出,并
      报错,而对于所定义的命令的错误,或是编译不成功,make 根本不理。make 只管文件的依赖性,即,如
      果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。
      通过上述分析,我们知道,像 clean 这种,没有被第一个目标文件直接或间接关联,那么它后面所定
      义的命令将不会被自动执行,不过,我们可以显示要 make 执行。即命令——make clean ,以此来清除
      所有的目标文件,以便重编译。
      于是在我们编程中,如果这个工程已被编译过了,当我们修改了其中一个源文件,比如 file.c ,那
      么根据我们的依赖性,我们的目标 file.o 会被重编译(也就是在这个依性关系后面所定义的命令),于
      是 file.o 的文件也是最新的啦,于是 file.o 的文件修改时间要比 edit 要新,所以 edit 也会被重新
      链接了(详见 edit 目标文件后定义的命令)。
      而如果我们改变了 command.h ,那么,kdb.o 、command.o 和 files.o 都会被重编译,并且,edit
      会被重链接。
    展开全文
  • make如何工作的

    2019-02-15 14:14:00
    那么,1、make在当前目录下找名字叫“Makefile”或“makefile”的文件。2、如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“edit”这个文件,并把这个文件作为最终的目标文件。3、...

    在默认的方式下,也就是我们只输入make命令。那么,
    1、make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
    2、如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“edit”这个文件,并把这个文件作为最终的目标文件。
    3、如果edit文件不存在,或是edit所依赖的后面的 .o 文件的文件修改时间要比edit这个文件新,那么,他就会执行后面所定义的命令来生成edit这个文件。
    4、如果edit所依赖的.o文件也存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。(这有点像一个堆栈的过程)
    5、当然,你的C文件和H文件是存在的啦,于是make会生成 .o 文件,然后再用 .o 文件生命make的终极任务,也就是执行文件edit了。
    这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。

    通过上述分析,我们知道,像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译。
    于是在我们编程中,如果这个工程已被编译过了,当我们修改了其中一个源文件,比如file.c,那么根据我们的依赖性,我们的目标file.o会被重编译(也就是在这个依性关系后面所定义的命令),于是file.o的文件也是最新的啦,于是file.o的文件修改时间要比edit要新,所以edit也会被重新链接了(详见edit目标文件后定义的命令)。
    而如果我们改变了“command.h”,那么,kdb.o、command.o和files.o都会被重编译,并且,edit会被重链接。

     

    GNU的make工作时的执行步骤入下:(想来其它的make也是类似)
    1、读入所有的Makefile。
    2、读入被include的其它Makefile。
    3、初始化文件中的变量。
    4、推导隐晦规则,并分析所有规则。
    5、为所有的目标文件创建依赖关系链。
    6、根据依赖关系,决定哪些目标要重新生成。
    7、执行生成命令。
    1-5步为第一个阶段,6-7为第二个阶段。第一个阶段中,如果定义的变量被使用了,那么,make会把其展开在使用的位置。但make并不会完全马上展开,make使用的是拖延战术,如果变量出现在依赖关系的规则中,那么仅当这条依赖被决定要使用了,变量才会在其内部展开。
    当然,这个工作方式你不一定要清楚,但是知道这个方式你也会对make更为熟悉。有了这个基础,后续部分也就容易看懂了。

     

    声明:由于不清楚makefile的匹配规则算法,下面的结论都是自己思考后测试的结果,如若有出错,还请指出

    =============================================================

    结论:(优先级由上往下递减)
    显式规则:

    完全匹配

    半匹配

    完全通配符匹配

    隐藏规则:

    (据说按照隐藏规则的顺序,测试发现,能一步达成的优先级高于分多步达成,

    例如:%:%.c > %.o:%.c + %:%.o)

    需要补充说明的是:显式规则若无命令,则此规则不参与匹配优先级

    ==============================================================

    以下为验证过程:

    <span style="font-size:18px;">.PHONY:all clean

    all:quick_sort bubble_sort
    #匹配1
    %_sort: %_sort.c
        @echo "matching $@"
        @echo 'in %_sort'
    #匹配2
    %:%.c
        @echo "matching $@"
        @echo 'in %'
    #匹配3
    quick_sort:quick_sort.c
        @echo "matching $@"
        @echo 'in quick_sort'

    clean:
        $(RM) *.o bubble_sort quick_sort</span>

    输出结果:

    $make
    matching quick_sort
    in quick_sort
    matching bubble_sort
    in %_sort
    $

    结论:

    显式规则中并不是按照上下文顺序匹配,因为匹配quick_sort时3个目标每一个都能匹配,而make选择了3最大匹配。匹配bubble_sort时,目标1、2均能匹配,然后make选择了2半匹配(%_sort)

    因此,显式匹配中,按照最大匹配优先,其次为半匹配,最后为完全通配符匹配


    由于显式规则能重载、取消隐藏规则(测试见我的另外一篇博客),因此显式规则优先级 > 隐藏规则
    ---------------------
    作者:GMPY_Tiger
    来源:CSDN
    原文:https://blog.csdn.net/gmpy_tiger/article/details/50899659
    版权声明:本文为博主原创文章,转载请附上博文链接!

    转载于:https://www.cnblogs.com/idyllcheung/p/10383403.html

    展开全文
  • 因为pycharm不会将当前文件目录自动加入自己的sourse_path。右键make_directory as-->sources path将当前工作的文件夹加入source_path就可以了。

    因为pycharm不会将当前文件目录自动加入自己的sourse_path。右键make_directory as-->sources path将当前工作的文件夹加入source_path就可以了。

    展开全文
  • Linux 系统中make和makefile如何使用make命令Makefile文件目标target前置条件prerequisites命令commandsCMakeCMakelist.txt编写样例 ...当make命令被执行时,它会扫描当前目录下Makefile或者makefile文件找

    make命令

    在linux系统中,make时一个用来编译的命令,项目开发和软件安装过程中我们经常会用到make或makeinstall。利用make工具我们就可以将大型开发项目分解成许多更易于管理的模块。

    • make的工作原理
      当make命令被执行时,它会扫描当前目录下Makefile或者makefile文件找到目标以及其依赖。
    1. make在当前目录下寻找“Makefile"或者”makefile“文件
    2. 若找到,查找文件中第一个目标文件.o
    3. 若目标文件不存在,根据依赖关系查找.s文件
    4. 若.s文件不存在,根据依赖关系查找.i文件
    5. 若.i文件不存在,根据依赖关系查找.c文件,此时.c文件一定存在,于是生成一个.o文件,再去执行

    Makefile文件

    Makefile文件有一系列的规则构成,每条规则形式如下:

    <target>: <prerequisites>
    [Tab]<commands>
    

    第一行冒号前为目标,冒号后为前置条件;第二行必须由一个Tab键起首,后接命令;目标是必须的,不可省略;前置条件和命令是可选的,但是二者必须至少存在一个。

    目标target

    目标可以是文件名,指明make命令所要构建的对象;也可以是某个操作名称,称为伪目标

    clean:
    	rm *.o
    

    以上代码的目标是clean,命令是rm*.o
    执行make clean命令,实现对象文件的删除;

    前置条件prerequisites

    前置条件通常是一组文件名,用空格隔开;

    命令commands

    命令表示如何更新目标文件,由一行或多行shell命令组成;注意:shell命令一定是写在命令中,否则会被make忽略,每行命令前必须有一个Tab键;每行命令在一个独立的shell中执行,shell之间没有继承关系,因此上一行的变量赋值在下一行无效;若前后两行命令有共享数据,可以写在同一行,用分号隔开。

    CMake

    CMake是开源、跨平台的构建工具,可以让我们通过编写简单的配置文件CMakelist.txt去生成本地的Makefile文件,这个配置文件是独立于运行平台和编译器的,这样就不用亲自去编写Makefile文件了,而且配置文件可以直接拿到其他平台上使用,无需修改,非常方便。

    CMakelist.txt编写样例

    • 同一目录下多个源文件
      对于下面这种文件结构,适用于小型项目,文件数量较少,并不是规范的分类管理习惯。
      在这里插入图片描述
      这时CMakelist.txt内容如下:
    cmake_minimum_required (VERSION 2.8)
    
    project (demo)
    
    add_executable(main main.c testFunc.c)
    
    

    第一行的意思是要求CMake的最低版本是2.8;第二行表示本工程信息,也就是工程名叫做demo;第三行比较关键,表示最终要生成的elf文件的名字叫做main,使用的源文件是main.c,testFunc.c。在终端下切换到main.c所在的目录下,然后输入以下命令运行CMake,
    cmake .
    这样就会在当前目录下生成makefile文件,接着在终端输入make并回车,main.c文件就编译完成了,这时我们需要的elf文件main成功生成。
    可以类推,如果在同一个目录下有多个源文件,那么只要在add_executable里把所有的源文件都添加进去即可。但是如果源文件的数量过多,cmake提供了一个命令可以把指定目录下的所有源文件存储在一个变量中,这个命令就是aux_source_directory(dir var)第一个参数是指定目录,第二个参数是存放源文件列表的变量。那么,我们的CMakelist.txt文件也可以写成下面这种形式:

    cmake_minimum_required (VERSION 2.8)
    
    project (demo)
    
    aux_source_directory(. SRC_LIST)
    
    add_executable(main ${SRC_LIST})
    

    使用aux_source_directory把当前目录下的源文件列表存放在变量SRC_LIST中,然后在add_executable调用SRC_LIST(注意调用变量的写法)。

    • 不同目录下多个源文件
      一般情况下,当程序文件比较多时,我们会进行分类管理,根据代码的不同功能放置在不同的目录下,这样方便查找,那么这种情况下该如何编写CMakelist.txt文件呢?整理好的文件结构如下:
      在这里插入图片描述
      这时,还是在main.c目录下新建CMakelist.txt文件,内容调整为下面所示:
    cmake_minimum_required (VERSION 2.8)
    
    project (demo)
    
    include_directories (test_func test_func1)
    
    aux_source_directory (test_func SRC_LIST)
    aux_source_directory (test_func1 SRC_LIST1)
    
    add_executable (main main.c ${SRC_LIST} ${SRC_LIST1})
    

    这次使用了一个新命令include_directories,该命令是用来向工程中添加多个指定头文件的搜索路径,路径之间用空格分开。因为main.c源文件中包含了testFunc.h和testFunc1.h,如果不用这个命令来指定头文件所在位置,就会无法编译,当然也可以在main.c里面使用include来指定路径,只是这种写法不太优雅,如下:

    #include "test_func/testFunc.h"
    #include "test_func1/testFunc1.h"
    
    • 正规一点的组织结构
      正规一点来说,我们会把源文件放在src目录下,把头文件放到include文件下,生成的对象文件存放在build目录下,最终输出的elf文件会放到bin目录下,这样整个结构更加清晰。比如下面这种结构:
      在这里插入图片描述
      这时,我们在最外层目录下新建一个CMakelist.txt文件,内容为:
    cmake_minimum_required (VERSION 2.8)
    
    project (demo)
    
    add_subdirectory (src)
    

    这里出现了一个新的命令add_subdirectory,这个命令可以向当前工程添加存放源文件的子目录,这里指定src目录下存放了源文件,当执行cmake时就会进入src目录下取寻找src目录下的CMakelist.txt文件,所以在src目录下也建立一个CMakelist.txt:

    aux_source_directory (. SRC_LIST)
    
    include_directories (../include)
    
    add_executable (main ${SRC_LIST})
    
    set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
    

    这里有出现了一个新命令set,是用于定义变量的,这里是把存放elf文件的位置设置为工程根目录下的bin目录。EXECUTABLE_OUTPUT_PATH和PROJECT_SOURCE_DIR是CMake自带的预定义变量,分别表示为:目标二进制可执行文件存放位置;工程根目录
    下面来运行cmake,不过这次我们将目录切换到buid目录下,然后输入以下命令:
    cmake ..
    Makefile文件会在build目录下生成,然后接着在build目录下运行make,这时文件已经编译好了,回到bin目录下,发现可执行文件main已经生成。解释一下为什么要在build目录下运行cmake,从之前几个例子可以知道,如果在最外层运行cmake,运行时啥呢工程的附带文件就会和源码文件混在一起,这样会对程序的目录结构造成污染,而在build目录下运行cmake,生成的附带文件只会呆在build目录下,如果我们不想要这些文件了可以直接清空该目录,非常方便。

    • 动态库和静态库的编译控制
      有时我们只需要编译出动态库,静态库,然后等着让其他程序去使用,这种情况我们该怎么使用cmake?
      在这里插入图片描述
      我们会在build目录下运行cmake,并把生成的库文件存放在lib目录下。最外层的CMakelist.txt内容如下:
    cmake_minimum_required (VERSION 2.8)
    
    project (demo)
    
    add_subdirectory (lib_testFunc)
    

    lib_testFunc目录下的CMakelist.txt如下,

    aux_source_directory (. SRC_LIST)
    
    add_library (testFunc_shared SHARED ${SRC_LIST})
    add_library (testFunc_static STATIC ${SRC_LIST})
    
    set_target_properties (testFunc_shared PROPERTIES OUTPUT_NAME "testFunc")
    set_target_properties (testFunc_static PROPERTIES OUTPUT_NAME "testFunc")
    
    set (LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
    

    这里有出现了新的命令和预定变量,add_library: 生成动态库或静态库(第1个参数指定库的名字;第2个参数决定是动态还是静态,如果没有就默认静态;第3个参数指定生成库的源文件);set_target_properties: 设置输出的名称,还有其它功能,如设置库的版本号等;LIBRARY_OUTPUT_PATH: 库文件的默认输出路径,这里设置为工程目录下的lib目录

    • 对库进行链接
      既然我们已经生成了库,那么就进行链接测试下。把build里的文件都删除,然后在在工程目录下新建src目录和bin目录,在src目录下添加一个main.c和一个CMakeLists.txt,整体结构如下,
      在这里插入图片描述
      工程目录下CMakelist.txt文件修改如下:
    cmake_minimum_required (VERSION 2.8)
    
    project (demo)
    
    add_subdirectory (lib_testFunc)
    add_subdirectory (src)
    

    src目录下的CMakelist.txt如下:

    aux_source_directory (. SRC_LIST)
    
    # find testFunc.h
    include_directories (../lib_testFunc)
    
    link_directories (${PROJECT_SOURCE_DIR}/lib)
    
    add_executable (main ${SRC_LIST})
    
    target_link_libraries (main testFunc)
    
    set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
    

    这里出现两个新的命令,link_directories: 添加非标准的共享库搜索路径,target_link_libraries: 把目标文件与库文件进行链接

    展开全文
  • Make如何工作的

    2009-06-07 22:14:00
    1、make在当前目录下找名字叫“Makefile”或“makefile”的文件。 2、如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“edit”这个文件,并把这个文件作为最终的目标文件。 3、如果...
  • make如何工作的?

    2011-06-05 12:13:10
    1、make在当前目录下找名字叫“Makefile”或“makefile”的文件。 2、如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“edit”这个文件,并把这个文件作为最终的目标文件。 3、...
  • 三、make如何工作的

    2013-10-11 15:30:57
     1、make在当前目录下找名字叫“Makefile”或“makefile”的文件。   2、如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“edit”这个文件,并把这个文件作为最终的目标文件。 ...
  • (4)打开secure-CRT软件,命令行输入tftp -gr gpmc-mgr 192.168.0.111 ,这样就把文件上传到装置当前的命令行目录下了。 (5)输入date命令,查看当前时间,然后用ls -la查看确定上传的文件的日期
  • 1、make在当前目录下找名字叫“Makefile”或“makefile”的文件。 2、如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“edit”这个文件,并把这个文件作为最终的目标文件。 3、...
  • 三、make如何工作的 ...1、make在当前目录下找名字叫“Makefile”或“makefile”的文件。 2、如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“edit”这个文件,并把这
  • linux make configure make

    2014-11-30 22:19:00
    开放源码:就是程序代码,写给人类看的程序语言,但机器并不认识,所以无法执行;...make在当前目录搜索 makefile文件,makefile里面记录了源码如何编译的信息 configure 建立makefile文件 gcc编译文件 g...
  • make执行过程

    2016-10-07 19:22:00
    转载自 陈皓《跟我一起写 Makefile》 一般来说,最简单的就是直接命令行下输入make命令,make命令会找当前目录的makefile来执行,一切都是自动的。但也有时你也许只想让make重编译某些文件,而不是整个工程,而又...
  • 如何在Linux安装tree上

    千次阅读 2017-03-19 16:57:07
    1.下载tree-1.7.0.tgz  2.切换到tmp目录 cd /tmp 上传文件到tmp目录下 rz ... (可以使用pwd 查看当前目录 ) 5.安装文件 make install  这里发现没有安装gcc命令 然后调用此命令yum install gcc安装gc
  • Makefile--Make运行

    2020-08-01 21:32:01
    一般来说,最简单的就是直接命令行下输入make命令,make命令会找当前目录的makefile来执行,一切都是自动的。 但也有时你也许只想让make重编译某些文件,而不是整个工程, 而又有的时候你有几套编译规则,你想...
  • Make 的运行

    2009-08-26 21:43:00
    一般来说,最简单的就是直接命令行下输入make命令,make命令会找当前目录的makefile来执行,一切都是自动的。但也有时你也许只想让make重编译某些文件,而不是整个工程,而又有的时候你有几套编译规则,你想不同...
  • Makefile详解-make运行

    2016-11-02 20:05:32
    一般来说,最简单的就是直接命令行下输入make命令,make命令会找当前目录的makefile来执行,一切都是自动的。但也有时你也许只想让make重编译某些文件,而不是整个工程,而又有的时候你有几套编译规则,你想不同...
  • 一般来说,最简单的就是直接命令行下输入make命令,make命令会找当前目录的makefile来执行,一切都是自动的。但也有时你也许只想让make重编译某些文件,而不是整个工程,而又有的时候你有几套编译规则,你想不同...
  • Makefile之make 的运行

    千次阅读 2014-06-05 19:51:13
    一般来说,最简单的就是直接命令行下输入make命令,make命令会找当前目录的makefile来执行,一切都是自动的。但也有时你也许只想让make重编译某些文件,而不是整个工程,而又有的时候你有几套编译规则,你想不同...
  • Makefile-- make 运行

    2017-11-29 10:57:38
    一般来说,最简单的就是直接命令行下输入make命令,make命令会找当前目录的makefile来执行,一切都是自动的。但也有时你也许只想让 make重编译某些文件,而不是整个工程,而又有的时候你有几套编译规则,你想...
  • make 的运行

    2005-12-31 15:36:00
    make 的运行——————一般来说,最简单的就是直接命令行下输入make命令,make命令会找当前目录的makefile来执行,一切都是自动的。但也有时你也许只想让make重编译某些文件,而不是整个工程,而又有的时候你有...
  • 一般来说,最简单的就是直接命令行下输入 make 命令,make 命令会找当前目录的 makefile 来执行,一切都是自动的。但也有时你也许只想让 make 重编译某些文件,而不是整个工程,而又有的时候你有几套编译规则,你...
  • 一般来说,最简单的就是直接命令行下输入make命令,make命令会找当前目录的makefile来执行,一切都是自动的。但也有时你也许只想让make重编译某些文件,而不是整个工程,而又有的时候你有几套编译规则,你想...
  • 1 make、makefile概述 makefile定义了一系列的规则,来规定哪些部分先编译,哪些部分后编译,写好makefile以后,只需一个make命令就可以让整个工程完全...make在当前目录下找名字为"makefile "或"Makefile"的文...
  • 一般来说,最简单的就是直接命令行下输入make命令,make命令会找当前目录的makefile来执行,一切都是自动的。但也有时你也许只想让make重编译某些文件,而不是整个工程,而又有的时候你有几套编译规则,你想不同...
  • make的运行及隐含规则

    千次阅读 2016-04-27 21:02:51
     一般来说,最简单的就是直接命令行下输入make命令,make命令会找当前目录的makefile来执行,一切都是自动的。但也有时你也许只想让make重编译某些文件,而不是整个工程,而又有的时候你有几套编译规则,想不同...
  • 一般来说,最简单的就是直接命令行下输入 make 命令, make 命令会找当前目录的makefile 来执行,一切都是自动的。但也有时你也许只想让 make 重编译某些文件,而不是整个工程,而又有的时候你有几套编译规则,你...

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 268
精华内容 107
关键字:

如何在当前目录make