在前两章的总结中,分别总结了一些编译程序所必须的命令和应用实例,分别是:
cmake_minimum_required 声明最低版本
project 声明工程名字
add_executable 添加可执行文件
add_library 打包成库
target_link_libraries 链接库到可执行文件上
aux_source_directory(<dir> <variable>) 把指定目录存进指定变量
add_subdirectory 添加子目录
本文将对剩余的部分常用命令做一个总结:
1. include_directories 指定头文件的搜索路径 (还是和之前一样的例子,lib.cpp文件和lib.h文件放在lib文件夹下,在文件夹以外的main.cpp必须把头文件include进来,include之后应该把路径跟上,例如#include"lib/lib.h",而通过在CMakeLists中加这么一句include_directories(./lib),那么main.cpp中即可直接#include"lib.h"而不用指定其路径。
2. message 执行Cmake命令时打印消息,具体形式为:MESSAGE([SEND_ERROR | STATUS| FATAL_ERROR] "message to display"),前面是可选的消息类型,后面是想要显示的消息内容
3. set 设置命令,具体形式为:SET(变量名 变量值)。对于这个命令,可以拿它来设置自定义的变量名,也可以设置cmake的内部变量,例如:
set( CMAKE_BUILD_TYPE "Release" )
set( CMAKE_CXX_FLAGS "-O3" )
# 添加c++ 11标准支持
set( CMAKE_CXX_FLAGS "-std=c++11" )
顺便提一句,编译类型可以设置Release或者Debug。二者区别在于:Debug模式下生成两个文件,除了.exe或.dll文件外,还有一个.pdb文件,该文件记录了代码中断点等调试信息;Release模式下生成一个文件.exe或.dll文件。前者是调试版本,后者是发布版本。默认是debug版本的。附带关于内置变量的说明:
CMAKE_INSTALL_PREFIX #make install 的安装路径
CMAKE_BUILD_TYPE #生成的目标为debug或者release
CMAKE_C_FLAGS #gcc 的编译参数指定,一般通过set 修改其值
CMAKE_CXX_FLAGS #g++ 和上面CMAKE_C_FLAGS 类似
CMAKE_CURRENT_SOURCE_DIR # 当前CMakeLists.txt所在的目录,主要用来定位某文件
CMAKE_CURRENT_BINARY_DIR # 当前CMakeLists.txt对应的编译时的目录
当然也可以随便按照自己的需求set一个变量,例如
set( My_flag 1 )
这样之后可以用${My_flag}来引用这个变量
4. set_target_properties 这个主要用途是解决相同名字的动态或者静态target被删除的问题。直接用例子来解释:
#片段
ADD_LIBRARY (hello_static STATIC ${LIBHELLO_SRC})
SET_TARGET_PROPERTIES (hello_static PROPERTIES OUTPUT_NAME "hello")
为了防止library中共享库和静态库重名,因此让"hello_static" 在输出时,不是"hello_static",而是以"hello"的名字显示。、
其中,OUTPUT_NAME 是可变的,比如可以换成hello_static对于CLEAN_DIRECT_OUTPUT这个属性的定义,或者是针对动态库定义其版本号和API号(VERSION指代动态库版本,SOVERSION指代API版本):
SET_TARGET_PROPERTIES (hello PROPERTIES VERSION 1.2 SOVERSION 1)
5. get_target_property,是把target的属性弄到变量里去,例如(把刚刚对hello_static换的名字hello保存到OUTPUT_VALUE这个变量里去:
get_target_property (OUTPUT_VALUE hello_static OUTPUT_NAME)
具体这块的内容,参见某位博主的详细解释:https://www.cnblogs.com/zhoug2020/p/5904206.html
6. link_directories:动态链接库或静态链接库的搜索路径,类似于include_directories的用法
7. option(var_name "comment" var_value) 给变量var_name赋值为var_value,comment是此变量的注释,和SET有类似的功效,用于给某变量设置默认值
8. configure_file 作用是让普通文件也能使用CMake中的变量。 也就是说代码文件中可以使用CMake中的变量。详解见这里。
在之后的内容里,我还会讲解关于Install和非常重要的find_package两大命令。