CMake自动添加源文件和头文件

最近要写一个测试程序,需要用到CMAKE,因为涉及到需要不断添加文件进去,虽然使用最基础的cmake去写,也可以实现,但是缺点是每次添加源码时都要修改一次cmake的依赖关系。于是看到一个自动检索的cmake,微调了一下实现编译自己的软件。

下面就用一个简单的例子记录一下用法:

原理就是遍历文件,查找源文件和头文件,然后源文件通过生成库的方式全部编译;头文件就通过替换字符串的方式获取头文件的目录,并且添加到工程编译中。最后生成可执行文件时链接依赖库就行了
#cmake最低版本需求,不加入此行会受到警告信息
cmake_minimum_required(VERSION 2.6)
project(CMAKE_TEST_APP) #项目名称

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) ##top 
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) #top

# 查找source目录下的所有*.cpp,*.c源文件,并将文件列表保存到 DIR_LIB_SRCS 变量
file(GLOB_RECURSE SRC_DIR_LIST "source/*.cpp" "source/*.c")	#遍历获取source/路径下所有的*.cpp和*.c文件列表

#将DIR_LIB_SRCS中文件列表以静态库的方式加入工程
add_library(
        ${PROJECT_NAME} STATIC
        ${SRC_DIR_LIST}										#将DIR_LIB_SRCS中文件列表以静态库的方式加入工程
)
message(STATUS "SRC_DIR_LIST = ${SRC_DIR_LIST}")			#打印SRC_DIR_LIST中列表信息


macro(FIND_INCLUDE_DIR result curdir)									#定义函数,2个参数:存放结果result;指定路径curdir;
	file(GLOB_RECURSE children "${curdir}/*.hpp" "${curdir}/*.h" )		#遍历获取{curdir}中*.hpp和*.h文件列表
	set(dirlist "")														#定义dirlist中间变量,并初始化
	foreach(child ${children})											#for循环
		string(REGEX REPLACE "(.*)/.*" "\\1" LIB_NAME ${child})			#字符串替换,用/前的字符替换/*h
		if(IS_DIRECTORY ${LIB_NAME})									#判断是否为路径
			list (FIND dirlist ${LIB_NAME} list_index)					#去重,查找dirlist中是否有${LIB_NAME}指定的值,可以区分字符串相同数子后缀不同的路径:例如/app/test_1和/app/test_2
			if(${list_index} LESS 0)									#若没找到则代表列表中没有该路径
				LIST(APPEND dirlist ${LIB_NAME})						#将合法的路径加入dirlist变量中  
			endif()														#结束判断
		endif()															
	endforeach()														#结束for循环
	set(${result} ${dirlist})											#dirlist结果放入result变量中
endmacro()

#查找include目录下的所有*.hpp,*.h头文件,并路径列表保存到 INCLUDE_DIR_LIST 变量中
FIND_INCLUDE_DIR(INCLUDE_DIR_LIST ${PROJECT_SOURCE_DIR}/source)			#调用函数,指定参数

#将INCLUDE_DIR_LIST中路径列表加入工程		
include_directories(   													#INCLUDE_DIR_LIST路径列表加入工程
        ${INCLUDE_DIR_LIST}
)
message(STATUS "INCLUDE_DIR_LIST = ${INCLUDE_DIR_LIST}")				#打印INCLUDE_DIR_LIST中列表信息

#生成可执行文件和目标链接依赖
add_executable(cmake_test_App  ${PROJECT_SOURCE_DIR}/source/main.c )
target_link_libraries( cmake_test_App ${PROJECT_NAME} )

参考:cmake自动添加所有源文件和头文件_cmake添加目录下所有的文件-CSDN博客

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值