# CMAKE组织子模块

# 建立文件结构

image-20230219141413378

SimpleLib
	|- SubLib
		|- CMakeLists.txt
		|- include
			| - sub.h
	    |- src
			| - sub.cpp
	|- main.cpp
	|- CMakeLists.txt

简单的来说就是用main.cpp去调用SubLib里的内容

  • cmake使用是多叉树来表示各个子模块,这也带来了一个问题
    • 就是Project创建的Target对象是全局的,但平行的子节点间无法访问对方的编译变量信息
      • 这有时会带来一个比较棘手的编译问题(常出现在三方模块的编译信息需要联动的情况下)
      • 这时就需要提交给顶部节点(对外层的cmake)进行中转,或者使用cmakecache系统

# Cmake解析

image-20230219142722640

  • 子模块(SubLib)的cmake使用include_directories将头文件搜索路径加入,从而让sub.cpp知道自己的头文件在哪里,并编译cpp为一个lib
  • 主cmake将路径SubLib,加入此工程中,cmake立刻进入此目录递归搜索模块,发现了子模块的对象名字SubLib
  • 主cmake将main.cpp编译成可执行文件,并告诉编译器main.cpp需要的头文件来自SubLib/include文件夹,需要链接的Target是SubLib

# 编译生成的文件

image-20230219143835553

  • 子模块在cmake的指挥下,编译成了一个叫libSubLib.a的静态库

image-20230219144824620

  • 以及在cmake的指挥中,被g++链接到了主程序二进制中并最终生成执行文件
Last Updated: 2/19/2023, 5:32:44 PM