Makefile中如何声明googletest依赖实现按需编译构建
Makefile 自动触发googletest构建的无兼容问题方案
不要硬编码googletest的静态库输出路径作为依赖项,最稳妥的实现方式是使用自定义哨兵标记文件作为依赖判断依据,完全和googletest内部的目录结构解耦。
具体实现
- 先统一定义路径变量,避免硬编码散落各处
# googletest源码根目录 GTEST_SRC_PATH := ../googletest # 你给googletest指定的构建目录,完全由你自己控制 GTEST_BUILD_PATH := $(GTEST_SRC_PATH)/build # 自定义构建完成哨兵文件,存在就代表gtest已经编译完成 GTEST_BUILD_MARK := $(GTEST_BUILD_PATH)/.build_done
- 编写哨兵文件的生成规则,只有标记文件不存在时才会执行全套gtest构建流程
$(GTEST_BUILD_MARK): mkdir -p $(GTEST_BUILD_PATH) # 执行cmake配置 cmake -S $(GTEST_SRC_PATH) -B $(GTEST_BUILD_PATH) # 并行编译gtest,可根据CPU核心数调整-j参数 cmake --build $(GTEST_BUILD_PATH) -j$(nproc) # 全部构建完成后生成标记文件 touch $(GTEST_BUILD_MARK)
- 将哨兵文件作为单元测试目标的依赖,链接时同时覆盖可能的库输出目录,兼容版本变动
unit_test: unit_test.cpp $(GTEST_BUILD_MARK) $(CXX) unit_test.cpp -o $@ \ -I$(GTEST_SRC_PATH)/googletest/include \ # 同时加入lib、libs两个历史版本用过的库输出路径,后续有新路径直接追加即可 -L$(GTEST_BUILD_PATH)/lib \ -L$(GTEST_BUILD_PATH)/libs \ -lgtest -lgtest_main -lpthread
方案优势
- 没有重复构建开销:只要哨兵文件存在,make会直接跳过gtest的cmake配置、编译全流程,不会浪费冗余的构建耗时
- 无版本兼容问题:依赖判断逻辑完全不依赖gtest内部的输出目录结构,哪怕后续gtest把库输出到其他目录,只需要在链接参数的
-L后追加新的搜索路径即可,依赖触发逻辑完全不需要改动 - 可控性强:需要强制重编gtest时,只需要手动删除
.build_done标记文件即可,不需要清理整个构建目录
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

