Cmake在windows支持预编译头文件(stdafx.h)
最近一直在研究cmake构建项目,之前接触cmake的时候就感觉不太喜欢cmake,觉得它太乱了,产生了太多的中间文件,产生的项目文件也不是特别友好,在windows下,生成的项目文件经常需要修改,而在linux和常规的makefile风格也打不一致,文件太多,不方便学习研究。
不够经过这段时间系统的研究,觉得cmake还是非常强大的,吃透之后它的确非常方便,比手工写makefile要简单的多,因此在linux使用cmake我觉得是非常合适的,不过在windows则相对要差一些。cmake的主要优势在于自动生成项目文件,如果熟练掌握,对于自动构架项目还是有很大帮助的。
本文主要讲下在windows下使用cmake给项目添加预编译头文件功能,做过windows项目的同学都知道,windows下使用预编译头文件非常普遍,能加快编译速度,一些头文件交叉引用问题也能使用它来解决,但是cmake对这块支持不是很完善,资料也很少,我在网上查询了很久,才找到一个合适的方案,下面就详细讲下这个方案。
为了复用预编译这个功能,我们把预编译相关的cmake功能编写成一个文件,比如叫msvcpch.cmake。
#msvcpch.cmake
#声明一个宏,参数如下
#USE_MSVC_PCH :宏名字
#PCH_TARGET :项目名称
#PCH_HEADER_FILE :预编译头文件名称(stdafx.h)
#PCH_SOURCE_FILE :预编译源文件名称(stdafx.cpp)
MACRO(USE_MSVC_PCH PCH_TARGET PCH_HEADER_FILE PCH_SOURCE_FILE)
IF(MSVC)
# 获取预编译头文件的文件名,通常是stdafx
GET_FILENAME_COMPONENT(PCH_NAME ${PCH_HEADER_FILE} NAME_WE)
# 生成预编译文件的路径
IF(CMAKE_CONFIGURATION_TYPES)
# 如果有配置选项(Debug/Release),路径添加以及配置选项
SET(PCH_DIR "${CMAKE_CURRENT_BINARY_DIR}/PCH/${CMAKE_CFG_INTDIR}")
ELSE(CMAKE_CONFIGURATION_TYPES)
SET(PCH_DIR "${CMAKE_CURRENT_BINARY_DIR}/PCH")
ENDIF(CMAKE_CONFIGURATION_TYPES)
# 创建预编译文件的路径
FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/PCH)
# 设置项目属性,使用预编译头文件
SET_TARGET_PROPERTIES(${PCH_TARGET} PROPERTIES COMPILE_FLAGS
"/Yu${PCH_HEADER_FILE} /FI${PCH_HEADER_FILE} /Fp${PCH_DIR}/${PCH_NAME}.pch")
# 预编译源文件(stdafx.cpp)设置属性,创建预编译文件
SET_SOURCE_FILES_PROPERTIES(${PCH_SOURCE_FILE} PROPERTIES COMPILE_FLAGS
"/Yc${PCH_HEADER_FILE}")
# 把预编译文件寄到清除列表
SET_DIRECTORY_PROPERTIES(PROPERTIES
ADDITIONAL_MAKE_CLEAN_FILES ${PCH_DIR}/${PCH_NAME}.pch)
ENDIF(MSVC)
ENDMACRO(USE_MSVC_PCH)
需要注意的是,PCH_HEADER_FILE (stdafx.h)不需要路径,只传文件名即可,而PCH_SOURCE_FILE(stdafx.cpp)则需要传完整路径,即在VS项目文件(.vcxproj)中能访问的正确路径,可以是相对路径,也可以绝对路径。
编写好这个文件之后,我们以后写cmake文件的时候可以可以直接引用它了。如下则是使用的示例:
if (CMAKE_SYSTEM_NAME MATCHES "Windows")
# msvcpch.cmake的路径
set(MSVCCMAKE_PCH ${CMAKE_SOURCE_DIR}/build/)
# 预编译头文件和源文件的路径
set(STDAFX_PCH_H ${CMAKE_SOURCE_DIR}/Protocol/stdafx.h)
set(STDAFX_PCH_C ${CMAKE_SOURCE_DIR}/Protocol/stdafx.cpp)
# 添加预编译cmake的路径
LIST(APPEND CMAKE_MODULE_PATH ${MSVCCMAKE_PCH})
# 包含msvcpch.cmake
INCLUDE(msvcpch)
endif ()
if (CMAKE_SYSTEM_NAME MATCHES "Windows")
# 添加源文件,生成可执行文件
add_executable(Proxy ${proxy_src} ${STDAFX_PCH_C})
# 添加链接库
target_link_libraries(Proxy Comm)
# 此处是关键,添加我们在msvcpch.cmake定义的宏
USE_MSVC_PCH(Proxy stdafx.h ${STDAFX_PCH_C})
endif ()
好了,使用上面的方法就可以给vs的工程添加预编译头文件的支持了。
- 主题建设之主题表
- mysql:索引原理与慢查询优化
- Silvelright:ListBox无法用Tab顺序切换内部元素焦点的解决
- 2017精典书店年度好书
- silverlight:贝塞尔曲线
- 三要素支撑“人工智能+安防”:识别技术扛大旗
- IO模型
- jenkins 从git拉取代码
- Silverlight:针式打印机文字模糊的改善办法
- 大数据和云计算技术周报:NoSQL特辑
- 常用业务接口界面化 in python flask
- 打印机设置(PrintDialog)、页面设置(PageSetupDialog) 及 RDLC报表如何选择指定打印机
- 区块链推动支付革命
- MySQL常见的库操作,表操作,数据操作集锦及一些注意事项
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 算法集锦(2)|scikit-learn| 如何利用文本挖掘推荐Ted演讲
- 算法集锦(3)|采用医疗数据预测糖尿病的算法
- 谁说Cat不能做链路跟踪的,给我站出来
- Libra:一种Python工具,可以用几行代码自动实现机器学习过程
- 国内首个“新基建”安全大赛启动了!
- Kubernetes 中 Informer 的使用
- 嵌入式开发中常见3个的C语言技巧
- 恕我直言,我也是才知道ElasticSearch条件更新是这么玩的
- 有了MinIO,你还会用FastDFS么?
- STP 实验
- 算法集锦(6) |基于GPU框架的tensorflow数据增强算法
- 交换机端口安全实验
- 算法集锦(7)| 实用代码 | Google Colab使用及配置技巧
- 浏览器标签页分屏_不同浏览器同一个tab里面怎么实现分屏?#技能get#
- 微信小程序开发实战(16):交互组件