《Muduo网络库:CMake构建集成编译环境》
CMake简介
使用简单方便,可以跨平台,构建项目编译环境。比直接写Makefile简单,在构建大型工程编译时,需要写大量的文件依赖关系,可以通过简单的CMake生成负责的Makefile文件。大部分的开源项目也都是使用CMake来编译的。
使用g++/gcc编译生成一个可执行程序通常是:
《Linux:动态库动态链接与静态库静态链接》-CSDN博客
g++/gcc -o 可执行文件名 源文件 -I(大i)头文件路径 -L库文件路径 -l(小L)库文件名
eg:
gcc -o mymath main.c -I ./mylib/include -L ./mylib/lib -l mymath
以上篇Muduo网络编程的服务器程序示例,要以g++编译运行:
《Muduo网络库:基于Muduo的网络服务器编程示例》-CSDN博客
使用CMake
首先要在系统的根目录下创建CMakeLists.txt配置文件,cmake命令会执行目录下的CMakeLists.txt配置文件里面的配置项。
一个基本的CMakeLists.txt配置文件内容如下,以编写的Muduo网络编程服务器程序示例。
一个大型工程中,会有很多模块,有的生成可执行文件,有的生成so动态库、静态库等,用命令是复杂的,所以,一般都是用CMake构建集成编译环境,简单方便。
cmake命令会在你指定的路径下找CMakeLists.txt文件生成相应的构建系统文件(如Makefile)。
生成构建文件后,可以看到也生成了Makefile,执行make进行实际编译。make clean清理可执行文件。
但是,编译产生的这些中间文件跟我们的工程文件掺杂到一起了,实际上,一般是不会这样去做的。
一个正式的工程构建
一个正式的源码工程应该有这几个目录:
- -bin 存放最终可执行文件
- -build 存放编译中间文件
- -include 存放头文件
- -lib 存放库文件
- -src 存放源文件
- -thridparty 存放第三方库文件
- -test 存放测试文件
- CMakeLists.txt 编译
对于当前程序,我们可以这样做,建立一个build目录,进入build执行cmake .. ,这样cmake编译生成的中间文件就在build目录下了。
再执行make。
但是,可执行文件就生成在build目录下了。在工程目录下并没有可执行文件。
那么,现在我们需要把可执行文件生成到新创建的bin目录下。更改CMakeLists.txt配置文件。
再重新执行cmake .. ,make。build目录下存放的就都是中间文件了,最终的可执行文件存放在工程目录下的bin目录里面。
这里CMakeLists.txt是用来编译testmuduo目录下的可执行文件的。还有一种常见的方式是,CMakeLists.txt放在工程根目录同级路径下(跟testmuduo一个路径下创建)用来做总控制编译。
在同级目录下执行cmake .,cmake会在当前目录下找到CMakeLists.txt,由于指定了搜索路径,就会去指定路径(testmuduo)继续找CMakeLists.txt生成构建文件。
CMake常用的预定义变量
PROJECT_NAME : 通过 project() 指定项目名称
PROJECT_SOURCE_DIR : 工程的根目录
PROJECT_BINARY_DIR : 执行 cmake 命令的目录
CMAKE_CURRENT_SOURCE_DIR : 当前 CMakeList.txt 文件所在的目录
CMAKE_CURRENT_BINARY_DIR : 编译目录,可使用 add subdirectory 来修改
EXECUTABLE_OUTPUT_PATH : 二进制可执行文件输出位置
LIBRARY_OUTPUT_PATH : 库文件输出位置
BUILD_SHARED_LIBS : 默认的库编译方式 ( shared 或 static ) ,默认为 static
CMAKE_C_FLAGS : 设置 C 编译选项
CMAKE_CXX_FLAGS : 设置 C++ 编译选项
CMAKE_CXX_FLAGS_DEBUG : 设置编译类型 Debug 时的编译选项
CMAKE_CXX_FLAGS_RELEASE : 设置编译类型 Release 时的编译选项
CMAKE_GENERATOR : 编译器名称
CMAKE_COMMAND : CMake 可执行文件本身的全路径
CMAKE_BUILD_TYPE : 工程编译生成的版本, Debug / Release
构建Muduo项目编译CMake文件
简单了解了CMake使用之后,我们顺便来构建接下来要写的Muduo项目编译CMake文件。