桓楠百科网

编程知识、经典语录与百科知识分享平台

C/C++项目cmake配置文件CMakeLists.txt的通用模板(二)

昨天的“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文件。而且对于大部分开发人员来说,上述内容基本能够满足需求。

六、联系

如果有任何疑问欢迎随时交流。学无止境,实事求是,每天进步一点点!

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言