东方耀AI技术分享

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 1517|回复: 4
打印 上一主题 下一主题

[C/C++] cmake是如何管理编译的C++项目

[复制链接]

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14451
QQ
跳转到指定楼层
楼主
发表于 2021-5-13 08:54:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
cmake是如何管理编译的C++项目






1、单个源文件   cmake_demo01_single
2、多个源文件  单个目录   cmake_demo02_multi
3、多个源文件  多个目录   cmake_demo03_multi




  1. # CMake最低版本要求
  2. cmake_minimum_required (VERSION 2.8)
  3. # 项目信息
  4. project (mathPowerDemo2)
  5. # 制定生成目标
  6. # 如果同一个文件夹下,特别多的源文件怎么办呢?
  7. # 使用aux_source_directory命令  查找制定目录下所有的源文件,然后把结果保存进指定的变量名
  8. aux_source_directory(. ALL_SRCS)
  9. # add_executable(mathPowerDemo2 main.cpp power.cpp)
  10. # cmake如何打印变量的结果? message()
  11. # 无) = 重要消息;
  12. # STATUS = 非重要消息;
  13. # WARNING = CMake 警告, 会继续执行;
  14. # AUTHOR_WARNING = CMake 警告 (dev), 会继续执行;
  15. # SEND_ERROR = CMake 错误, 继续执行,但是会跳过生成的步骤;
  16. # FATAL_ERROR = CMake 错误, 终止所有处理过程;
  17. message(WARNING "所有源文件:"${ALL_SRCS})
  18. add_executable(mathPowerDemo2 ${ALL_SRCS})
复制代码





  1. cmake_minimum_required (VERSION 2.8)
  2. project (mathPowerDemo3)
  3. aux_source_directory(. ALL_SRCS)                        # 添加当前目录下所有的源文件
  4. add_subdirectory(lib)                                                # 添加lib子目录
  5. add_executable(mathPowerDemo3 ${ALL_SRCS})        # 指定生成目标,注意这里要用${ALL_SRCS}!!!
  6. message(WARNING "我说:lib目录里的文件编译成静态库再由main函数调用")
  7. target_link_libraries(mathPowerDemo3 power)        # 添加链接库,power是在lib子目录的CMakeLists中定义的


复制代码









  1. # 子目录中的CMakeLists本质上是去生成一个链接库
  2. aux_source_directory(. LIB_SRCS)                        # 添加当前目录下所有的源文件
  3. message(WARNING "我说:命令add_library将lib目录中的源文件编译为静态链接库")
  4. add_library(power ${LIB_SRCS})                                # 当前目录下的文件生成一个链接库
复制代码





cmake_demo_all.zip

5.91 KB, 阅读权限: 188, 下载次数: 1

让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14451
QQ
沙发
 楼主| 发表于 2021-5-13 08:56:41 | 只看该作者
aux_source_directory(<dir> <variable>)                                        # 添加<dir>目录下所有的文件,保存到<variable>变量中
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14451
QQ
板凳
 楼主| 发表于 2021-5-13 08:57:03 | 只看该作者
add_executable(projectName ${variable})                                        # 把<variable>中的所有文件,编译成<projectName>可执行文件
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14451
QQ
地板
 楼主| 发表于 2021-5-13 08:58:04 | 只看该作者
add_subdirectory(<sub_dir>)                                                                # 添加一个子目录<sub_dir>
target_link_libraries(projectName sub_projectName)                # 把子目录的<sub_projectName>库链接到<projectName>主库中
在多目录编译中,还需要在子目录的CMakeLists.txt中设置好链接库
add_library(sub_projectName ${variable})                                # 当前目录下的文件生成一个链接库 静态的

# 指定生成动态库
add_library(math SHARED ${SRC_LIST})      # 中间加一个 shared 即可

让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14451
QQ
5#
 楼主| 发表于 2021-5-17 10:35:46 | 只看该作者
# 现阶段,你只需要了解 SET 指令可以用来显式的定义变量即可
# 将 hello.cpp 赋值给 SRC_LIST 变量,也可以指定多个源文件,用空格隔开
# SET(SRC_LIST hello.cpp add.cpp sub.cpp)
SET(SRC_LIST hello.cpp)
# ${SRC_LIST}是引用变量,也就是源文件 hello.cpp
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|人工智能工程师的摇篮 ( 湘ICP备2020019608号-1 )

GMT+8, 2024-6-18 22:02 , Processed in 0.236303 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表