MakeFile基础知识&多目录编译

本文介绍了一种在多目录工程中使用Makefile的方法。通过在主目录和子目录中分别设置Makefile,并创建一个公共的env.mk文件来统一配置变量和规则。这种结构可以有效地组织大型项目的编译流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Makefile的基础知识
http://blog.youkuaiyun.com/runninglion/article/details/28111859

======================================================================================================
多目录工程的 makefile 范例
http://blog.sina.com.cn/s/blog_449fafb90100y37u.html


假设要编译的工程是一个主目录proj, 它下面有4个子目录: /main /ui /math /obj
其中
main中包含文件 main.c
ui 中包含了文件 ui.h ui.c
math 中包含了文件 math.h math.c
obj 用于存放最终生成的目标
他们的关系是
main.c include "ui.h" "math.h"
ui.c include "ui.h" "math.h"
math.c include "math.h"
要求是在proj 目中的obj 目录中生成 out(主程序) ui.o main.o




第一种做法是在每一个子目录中都添加一个makefile文件, 当然主目录proj中的makefile必不可少,同时还在主目录中
创建一个env.mk文件,其作用就是包含了其他makefile都用到的模式规则
--------------------- env.mk----------------------------
CC := gcc


LIB_DIR = $(MAKEROOT)/libs
APP_DIR = $(MAKEROOT)/src
TARGET_DIR = $(MAKEROOT)/target
BUILD_DIR = $(MAKEROOT)/build


TARGET_PROG = $(TARGET_DIR)/just_cti_server


#头文件目录
INCLUDE_DIR := \  
-I$(MAKEROOT)/ui \
-I$(MAKEROOT)/main \
-I$(MAKEROOT)/math




CFLAGS = \
  -fPIC \
-O3 \
$(DEBUG) \
-Wall  \
$(INCLUDES)


LDFLAGS = \
-lpthread \
-L/usr/lib64/mysql \
-lmysqlclient \


#对所有的.o文件以.c文件创建它
%.o : %.c
${CC} ${CFLAGS} -c $< -o $(TARGET_DIR)/$@
--------------------------------------------------------


-------------------proj/makefile -----------------------
export MAKEROOT := $(shell pwd)
include ./env.mk


SUBS := $(shell find . -name "Makefile")
SUBDIRS := $(dir $(filter-out ./Makefile, $(shell find . -name "Makefile")))
include $(MAKEROOT)/evn.mk


define build_sub_obj
        for dir in $(SUBDIRS); do \
                make -C $$dir; \
        done
endef




all :
@$(call build_obj) #调用过程
$(CC) $(TARGET_DIR)/*.o $(LDFLAGS) -o $(TARGET_PROG)  #生成最终目标
clean :
-rm ./obj/*.o ./out ./obj/*.so
--------------------------------------------------------


------------- ui/makefile & main/makefile ----------------
include $(MAKEROOT)/env.mk #包括头文件,执行模式规则
SRCS := $(wildcard *.c)
OBJS := $(patsubst %.c,%.o,$(SRCS)) #生成所有.c文件对应的.o文件
.PHONY : all
all : $(OBJS)
--------------------------------------------------------


------------------ math/makefile -----------------------
include $(MAKEROOT)/env.mk #包括头文件,执行模式规则
.PHONY : all
all :
gcc -shared -o $(LIB_DIR)/libmath.so math.c math.h #生成动态库文件
--------------------------------------------------------

### 如何在 Postman解密并查看接口返回的加密内容 #### 使用 Test Script 实现 AES 解密Postman 的 `Tests` 脚本区域,可以通过编写 JavaScript 来实现对接口返回数据的解密操作。如果接口返回的是经过 AES 加密的数据,则可以在脚本中引入相应的解密逻辑,并将解密后的结果存储到环境变量或全局变量中以便后续使用。 以下是基于 AES 解密的一个简单示例: ```javascript // 假设接口返回的结果是一个 JSON 对象,其中 data 字段为加密字符串 const response = pm.response.json(); const encryptedData = response.data; // 定义 AES 解密函数 (假设已知 key 和 iv) function decryptAES(encryptedText, key, iv) { const CryptoJS = require("crypto-js"); const decryptedBytes = CryptoJS.AES.decrypt(encryptedText, CryptoJS.enc.Utf8.parse(key), { iv: CryptoJS.enc.Utf8.parse(iv) }); return decryptedBytes.toString(CryptoJS.enc.Utf8); } // 设置解密所需的 key 和 iv (需根据实际情况调整) const aesKey = "your-aes-key"; // 替换为实际使用的 AES 密钥 const aesIv = "your-aes-iv"; // 替换为实际使用的 AES 初始向量 // 执行解密 try { const decryptedData = decryptAES(encryptedData, aesKey, aesIv); console.log(`Decrypted Data: ${decryptedData}`); // 将解密后的内容保存至环境变量 pm.environment.set("decrypted_data", decryptedData); } catch (error) { console.error("Error during decryption:", error.message); } ``` 上述代码实现了以下功能[^1]: 1. 获取接口返回的加密数据; 2. 使用指定的 AES 密钥和初始向量对数据进行解密; 3. 将解密后的数据打印到控制台,并将其存入环境变量供其他请求调用。 --- #### 在 Visualize 选项卡中展示解密后的数据 为了更直观地观察解密后的数据,可以利用 Postman 提供的 `Visualize` 功能来渲染 HTML 页面。这一步骤允许开发者自定义界面样式,从而更加清晰地呈现复杂结构化的数据。 下面是一段简单的 HTML 渲染模板,用于显示解密后的文本内容: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Decrypted Response</title> <style> body { font-family: Arial, sans-serif; margin: 20px; } .container { max-width: 600px; margin: auto; } pre { background-color: #f4f4f4; padding: 10px; border-radius: 5px; } </style> </head> <body> <div class="container"> <h1>Decrypted Content:</h1> <pre>{{environment.decrypted_data}}</pre> </div> </body> </html> ``` 这段代码会从环境中提取名为 `decrypted_data` 的变量值,并以预格式化的方式呈现在页面上。 --- #### 处理 RSA 或 SM-RSA 类型的解密需求 当遇到非对称加密算法(如 RSA 或国密标准下的 SM-RSA),则需要额外安装支持这些算法的库文件。由于 Postman 默认不提供此类扩展能力,因此可能需要借助外部工具完成私钥加载与签名验证等工作后再导入回 Postman 测试流程中[^3]。 一种常见做法是预先准备好一个独立的服务端程序负责处理复杂的加解密运算过程,而客户端仅发送待处理的数据包给该服务即可获得最终结果。 --- #### 接口测试的核心目标回顾 无论采用何种技术手段来进行数据解析,在设计测试方案时都应始终围绕以下几个方面展开评估工作[^2]: - **功能性校验**: 确认 API 是否能够按照预期传递有效负载。 - **安全性保障**: 验证敏感信息是否被妥善保护免受未授权访问威胁。 - **错误恢复机制**: 检查系统面对非法输入或者网络中断等情况的表现情况。 综上所述,合理运用 Postman 内置特性配合适当编码技巧可以帮助我们高效达成既定目的——即成功解读隐藏于层层防护之后的真实业务含义! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值