最基础的同级文件操作
首先,创建CMakeLists.txt,这是CMake处理的基本文件。首先给出只有一个文件的最简单的情况:
PROJECT (HELLO)
SET(SRC_LIST main.cc)
MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir " ${HELLO_SOURCE_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST})
几个说明:
PROJECT
:这是项目名称说明,直接添加项目名称即可。SET
:变量说明,用于显示的变量定义,有多个源文件,可以设置为SET(SRC_LIST main.cc t1.cc t2.cc)
MESSAGE
:向终端输出用户定义的信息,三种类型:SEND_ERROR
:产生错误,生成过程被跳过STATUS
:输出前缀为-
的信息FATAL_ERROR
:立即终止所有的cmake过程
ADD_EXECUABLE
:添加源文件操作,${}
是获取变量的操作,这与shell语法一致。hello
是可执行文件的名称,可执行文件名称和工程名称没有任何关系。<projectname>_BINARY_DIR
或者PROJECT_BINARY_DIR
是指编译发生的当前目录;本例子中说的是build目录
之后,在CMakeLists.txt同级文件夹中,创建一个build
文件夹,之后cd build
,执行以下两个命令:
cmake ..
:CMake构建有关的MakeFile等make
:执行make编译操作,生成可执行文件
复杂多级目录操作
这里的文件设计到多个目录,同时我们还有帮助文档等。在编译完成后,我们希望把可执行文件加入到指定的bin目录中,最后还要把程序安装在操作系统的/usr/bin
目录中。
首先创建目录结构:
.
├── build
├── CMakeLists.txt
└── src
├── CMakeLists.txt
└── main.cpp
其中,main.cpp
与上一节的一致,build
文件夹同级的CMakeLists.txt
的内容如下:
CMAKE_MINIMUM_REQUIRED(VERSION 3.14)
PROJECT(HELLO)
ADD_SUBDIRECTORY(src bin)
与main.cpp
同级的目录内容如下:
ADD_EXECUTABLE(hello main.cpp)
说明ADD_SUBDIRECTORY
的意义:ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
。该指令用于向当前工程添加存放源文件的子目录,并指定中间二进制和目标二进制存放的位置。EXCLUDE_FROM_ALL
的含义是把这个目录从编译过程中排除。
注意上述完成编译后,我们在build
目录下发现了一个bin
目录,这个目录内部有一个hello
可执行文件。如果我们想把可执行文件放到其他地方,或者把动态链接库或者静态链接库放到其他地方,需要分别执行以下两个命令:
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
因为我们有两个CMakeLists.txt,添加语句的原则是:在哪里使用ADD_EXECUTABLE
或者ADD_LIBRARY
,如果需要改变目标存放路径,就在需要改变的地方加入相关语句。本例子中,肯定实在src的CMakeLists.txt文件中添加了。
CMake定义安装目录
一般来说,makefile执行make
过后,可以使用make install
进行安装。在CMake中,我们可以自定义安装目录,实现可执行文件或者程序库的安装操作,这里涉及到一个核心变量CMAKE_INSTALL_PREFIX
和一个核心指令INSTALL
。
使用SET
命令可以显示指定第一个变量的具体值,之后可以进行INSTALL
命令的配置,基本的配置方式如图:
给出一个简单的例子:
myrun
可执行二进制文件安装到了${CMAKE_INSTALL_PREFIX}/bin
目录中,mylib
动态链接库和mystaticlib
分别安装到对应的目录中。我们不需要关系TARGETS具体生成的路径,只需要添加上TARGETS名称即可。
举个实战例子,首先在桌面创建foo文件夹,之后在上一节的最外层的CMakeLists.txt文件的最后,追加如下命令:
SET(CMAKE_INSTALL_PREFIX /home/erick/Desktop/foo)
INSTALL(TARGETS hello
RUNTIME DESTINATION bin
)
之后进入工程的build目录,依次执行:cmake ..
、make
、make install
。最后会发现桌面的foo目录下多了一个bin文件夹,里面是hello
可执行文件。
有些时候,我们也需要安装文档到合适的位置,这个指令也包含在INSTALL
中,举个例子:
INSTALL(DIRECTORY doc/ DESTINATION /share/dock/cmake/pro)
如果不指定特殊的路径,CMAKE_INSTALL_PREFIX
默认是/usr/local