一、Makefile介绍

慢慢项目代码成型以后,老师又交给我们Makefile的使用,才发现多好用。一个项目文件中的源文件不计其数,按类型、功能模块分别存放在若干个目录当中,而你要运行的时候,总不能一个一个打开去运行命令,而makefile制定了一系列规则,那些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至需要一些更复杂的功能操作,都可以通过makefile去执行,他就像一个Shell脚本一样,其中也可以去执行操作系统的命令,下面我们就以我上一篇博客里创建的文件夹来操作来编写一下makefile
上一篇博客链接
点击链接

二、 Makefile的通用结构

#以'#'开头的行表示注释
#定义变量VAR,强制赋值为app
VAR=test 
#在VAR之前定义的值后面再追加app这个值,这时该变量值扩展为testapp 
VAR+=app 
#如果之前VAR没有被定义,则定义并使用testapp;否则使用之前的值。
VAR?=testapp 
# 第一条目标为总的目标,
# 依赖可以是文件(目录)或为其他目标
# 动作可以是Linux命令,动作的那一行必须以TAB键开头
target: depend1 depend2 depend3 ... 
[TAB] action1 
[TAB ] action2 
target1: 
[TAB] action1 
[TAB] action2

默认的情况下,make命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件,找到后就解释并执行该文件,如果找不到就提示错误并退出。一般Makeifle文件名我们会用Makefile或makefile,而不会使用GNUmakefile。接下来我们以之前的静态库和动态库为例讲解makefile的编写和使用。

三、写Makefile

之前我们在文件路径下需要敲好几条命令才能编译生成动态库文件,而如果要拷贝安装文件或删除不用的文件时也要添加额外的命令。这样如果每次都要编译、安装、删除就比较麻烦。而如果我们写了一个makefile之后,接下来的工作只需要敲一条命令即可。下面是lib路径下用来生产静态库和动态库的makefile文件:

  • 静态库Makefile
    在这里插入图片描述

  • 动态库Makefile
    在这里插入图片描述

  • main函数Makefile
    在这里插入图片描述此时我们可以去敲make或者其他分别运行得到我们想要的结果,但是我们也可以在最顶层的目录里写个总Makefile来管理子文件的Makefile,这样就太方便了!

  • 最顶层的Makefile(一步运行到位)
    在这里插入图片描述

  • 最后获得目录结构
    在这里插入图片描述
    这样就一目了然,感觉想上级管理下级,方便了太多!!

  • 最后运行
    在这里插入图片描述
    程序运行成功,然后我们查看一下各级文件的Makefile分别都完成任务了没有
    在这里插入图片描述
    都已经分别生成各自的库文件,并且复制到了lib/文件路径下,既然程序运行成功了,我们就收尾吧.
    在这里插入图片描述
    可以看到,我们输入make clean ,Makefile就依据我们写的语句清空了所有产生的库文件、可执行文件等,是不是特别方便。这里也只是我个人初写Makefile的个人笔记,Makefile里还有很多强大的功能,我们一起慢慢学习!

Makefile一、Makefile介绍二、 Makefile的通用结构三、写Makefile一、Makefile介绍慢慢项目代码成型以后,老师又交给我们Makefile的使用,才发现多好用。一个项目文件中的源文件不计其数,按类型、功能模块分别存放在若干个目录当中,而你要运行的时候,总不能一个一个打开去运行命令,而makefile制定了一系列规则,那些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至需要一些更复杂的功能操作,都可以通过makefile去执行,他就像一个Shell脚本一样,其
建立一个新的目录,然后把这三个文件拷贝到目录中,也把 Makefile 文件拷贝到目录中。之后,对 Makefile 的相关项目进行如下设置:  PROGRAM   := hello      # 设置运行程序名 SRCDIRS   := .          # 源程序位于当前目录下 SRCEXTS   := .c .cxx    # 源程序文件有 .c 和 .cxx 两种类型
add_custom_command: 增加客制化的构建规则到生成的构建系统中。对于add_custom_command,有两种使用形式。第一种形式是增加一个客制命令用来产生一个输出。  add_custom_command(OUTPUT output1 [output2 ...]                      COMMAND command1[ARGS] [args1...]
转发链接:https://www.cnblogs.com/JoyPoint/p/11629521.html 我们经常会遇到将第三方库文件复制到项目运行时文件夹,或者将子项目生成的库文件复制到项目运行时文件夹的情况,本文介绍FILE-COPY、add_custom_command、ADD_CUSTOM_TARGET三种方法及CMake COMMAND提供的命令说明。 一、 FILE-COPY
#设置当编译路径为当前文件夹所在路径 LOCAL_PATH := $(call my-dir)#清空编译环境的变量(由其他模块设置过的变量) include $(CLEAR_VARS)其中: #BUILD_STATIC_LIBRARY:编译为静态库。 #BUILD_SHARED_LIBRARY :编译为动态库 #BUILD_EXECUTABLE:编译为Native C可执行程序 LOCAL_P
好的,让我来解答你的问题。 在编写Makefile时,我们可以使用动态编译来构建我们的程序。动态编译意味着在运行时加载库,并将其链接到我们的程序中,而不是在编译时将库静态链接到我们的程序中。 下面是一个简单的Makefile示例,它使用动态编译来构建程序: # 编译器 CC = gcc # 编译选项 CFLAGS = -Wall -O2 # 链接选项 LDFLAGS = -lm # 目标文件 TARGET = program # 源文件 SRCS = main.c foo.c bar.c # 中间文件 OBJS = $(SRCS:.c=.o) # 默认目标 all: $(TARGET) # 生成可执行文件 $(TARGET): $(OBJS) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ # 生成中间文件 %.o: %.c $(CC) $(CFLAGS) -fPIC -c -o $@ $< clean: rm -f $(OBJS) $(TARGET) 在上面的Makefile中,我们使用了一个变量 `LDFLAGS` 来指定我们要链接的库,这里我们链接了标准数学库 `libm`。同时,我们在编译选项 `CFLAGS` 中加入了 `-fPIC` 参数,以告诉编译器生成位置无关代码,用于动态链接。 在生成中间文件时,我们使用了通配符 `%.o` 来匹配所有的 `.c` 文件,并将其编译为对应的 `.o` 文件。 最后,我们定义了一个 `clean` 目标来清理中间文件和生成的可执行文件。 希望这个示例能够帮助你理解如何在Makefile使用动态编译。