昨天的“C/C++项目cmake配置文件CMakeLists.txt的通用模板(一)”内容,主要描述了cmake的C/C++项目涉及的项目CMakeLists.txt文件、目录CMakeLists.txt文件、库CMakeLists.txt文件、可执行程序CMakeLists.txt文件和工具CMakeLists.txt等5类常用的CMakeLists.txt文件,并介绍了项目CMakeLists.txt文件的通用模板,但是还遗留其它4类常用的CMakeLists.txt文件没有说完,今天继续把它完成。
一、 目录CMakeListst.txt文件通用模板
目录CMakeListst.txt文件相对比较简单,主要描述需要处理的子目录列表,示例通用模板如下:
# 添加要处理的目录列表,每行单独一个目录
ADD_SUBDIRECTORY(XXX)
ADD_SUBDIRECTORY(XXX)
……
ADD_SUBDIRECTORY(XXX)
其中,XXX对应需要处理的目录名称。需要处理多个目录,就有多行ADD_SUBDIRECTORY指令,是不是很简单?
那么,对应我们的示例/code代码,对应的/code/bin/CMakeLists.txt、/code/lib/CMakeLists.txt、
/code/module/CMakeLists.txt文件内容分别如下:
# /code/bin/CMakeLists.txt
# 添加要处理的目录列表,每行单独一个目录
ADD_SUBDIRECTORY(service)
# /code/lib/CMakeLists.txt
# 添加要处理的目录列表,每行单独一个目录
ADD_SUBDIRECTORY(util)
# /code/module/CMakeLists.txt
# 添加要处理的目录列表,每行单独一个目录
ADD_SUBDIRECTORY(testnet)
看了上面的示例,说实话,目录CMakeLists.txt文件真的就是这么简单。
二、库CMakeListst.txt文件通用模板
虽然有动态库和静态库的区分,但是相比较而言,动态库有太多的优势,本人也是一直使用动态库,没有使用过静态库。为了避免存在说的不准确,这里就只描述动态库,其CMakeLists.txt文件通用模板示例如下:
# 目标文件名称
STRING(REGEX REPLACE ".*/(.*)" "\\1" CURRENT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR})
SET(DESTOBJ ${PROJECT_NAME}.${CURRENT_FOLDER})
# 将当前目录下的源代码文件列表赋给变量SRC_LIST
AUX_SOURCE_DIRECTORY(. SRC_LIST)
# 添加动态库
ADD_LIBRARY(${DESTOBJ} SHARED ${SRC_LIST})
# 设置依赖关系,如果当前库是最底层的共享库,则不需要设置
# 个人习惯动态库的命名规则为“项目名称.库名称.扩展名”
ADD_DEPENDENCIES(${DESTOBJ}
${PROJECT_NAME}.XXX
)
# 添加要链接的共享库
TARGET_LINK_LIBRARIES(${DESTOBJ}
${PROJECT_NAME}.XXX
)
# 设置版本号,SOVERSION为API版本号
SET_TARGET_PROPERTIES(${DESTOBJ} PROPERTIES VERSION 1.0.0 SOVERSION 1)
# 安装动态库文件
INSTALL(TARGETS ${DESTOBJ} LIBRARY DESTINATION lib)
上述相关代码的注释都写的很清楚,对应我们的示例/code代码,
/code/lib/util/CMakeLists.txt文件和
/code/module/testnet/CMakeLists.txt文件的最终形态,就留给大家参考模板进行调整练习了。
三、可执行程序CMakeLists.txt文件通用模板
可执行程序CMakeLists.txt文件内容与库CMakeLists.txt文件的内容有点类似,主要区别是一个生成库文件,一个生成可执行文件,其对应CMakeLists.txt文件通用模板示例如下:
# 目标文件名称
STRING(REGEX REPLACE ".*/(.*)" "\\1" CURRENT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR})
SET(DESTOBJ ${CURRENT_FOLDER})
# 将当前目录下的源代码文件列表赋给变量SRC_LIST
AUX_SOURCE_DIRECTORY(. SRC_LIST)
# 添加可执行程序
ADD_EXECUTABLE(${DESTOBJ} ${SRC_LIST})
# 设置依赖关系,如果当前库是最底层的共享库,则不需要设置
ADD_DEPENDENCIES(${DESTOBJ}
${PROJECT_NAME}.XXX
)
# 添加要链接的共享库
TARGET_LINK_LIBRARIES(${DESTOBJ}
${PROJECT_NAME}.XXX
)
# 设置版本号,SOVERSION为API版本号
#SET_TARGET_PROPERTIES(${DESTOBJ} PROPERTIES VERSION 1.0.0 SOVERSION 1)
# 安装可执行文件
INSTALL(TARGETS ${DESTOBJ} RUNTIME DESTINATION bin)
看到与库CMakeLists.txt文件的区别了吗?还没有的话,那就再好好看一下,还是很容易辨认的。
四、工具CMakeLists.txt文件通用模板
工具CMakeLists.txt文件相对来说更简单,主要是依据实际需要做些额外操作,个人比较常用的就是安装文件,比如安装脚本文件,所以其通用模板示例也相对简单,具体如下:
# 安装文件
INSTALL(PROGRAMS
XXX
DESTINATION script
)
如果存在安装脚本以外的其它需求,都可以根据需要往该CMakeLists.txt文件里装。因为个人主要就用到安装文件,所以主要进行了对应的示例说明。
五、结语
至此,C/C++项目cmake配置文件CMakeLists.txt的通用模板内容就完全说完了。当然,限于个人所学和接触有限,实际提到的也是部分常用内容,可能无法完全满足你的现实需要。但是没关系,基于上述模板内容,相信可以快速搭建符合自己的CMakeLists.txt文件。而且对于大部分开发人员来说,上述内容基本能够满足需求。
六、联系
如果有任何疑问欢迎随时交流。学无止境,实事求是,每天进步一点点!