这两天学习了使用cmake工具来组织编译自己的代码工程,使用cmake的需求是随着代码量的积累和调用文件增多自然而然产生的——如果每次调试和编译代码文件都要使用g++并且在后面追加一长串文件的路径,把这种重复的事情做在表面上终归是比较naive的一种方式。
我参考学习了大神潘伟洲的博客(https://www.hahack.com/codes/cmake/
),该文章详细讲述了如何使用cmake工具来管理和调试自己的项目工程。目前我明确需要”多目录多个源文件“,因此先把这一部分掌握,记录在这里。
- 0.首先初始的文件树结构如下:
.
├── CMakeLists.txt
├── main.cpp
└── tools
├── advCircle.cpp
├── advCircle.h
├── CMakeLists.txt
├── myPoint.cpp
├── myPoint.h
├── myTree.cpp
├── myTree.h
├── rectango.cpp
└── rectango.h
1 directory, 11 files
在main.cpp同级目录下和调用的工具文件夹tools下各有一个CMakeLists.txt,里面的内容是不同的,暂且不表。两个文件的作用是不同的,tools下面的CMakeLists.txt是用于把tools下面的代码文件编译为一个静态库文件供上级的main.cpp调用,而main.cpp同级的CMakeLists.txt是为了连接所需要的工具库来编译和生成Makefile,生成这个Makefile之后再make就可以得到可执行文件了。
- tools文件夹里面的CMakeLists.txt编辑如下内容
# 查找当前目录下的所有源文件
# 并将名称保存到DIR_LIB_SRCS变量
aux_source_directory(. DIR_LIB_SRCS)
# 生成链接库
add_library (ToolFunctions ${DIR_LIB_SRCS})
在代码段里面,我把tools文件夹里面最后生成的静态库文件命名为ToolFunctions,这个名称在上级的CMakeLists.txt里面也可以看到。
- main.cpp对应的CMakeLists.txt编辑如下内容
# CMake最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (Demo3)
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS变量
aux_source_directory(. DIR_SRCS)
# 添加tools子目录
add_subdirectory(tools)
# 指定生成目标
add_executable(Demo ${DIR_SRCS})
# 添加链接库
target_link_libraries(Demo ToolFunctions)
在这一步里面,把我最后生成的可执行程序命名为“Demo”。
- 最后在main.cpp一级的目录下,执行
cmake .
会自动生成所有需要的文件,继续操作
make
成功的话就可以看到定义的可执行程序Demo就出现了。