CMake初步入门

CMake

  • 当只有单个源文件时,可以用gcc命令编译它。
  • 当有多个源文件时,就可以使用make工具。
    • make本身并没有编译和链接的功能,而是通过调用makefile文件中命令来进行编译和链接的。
  • makefile对于工程量比较大的项目不适用,然后跨平台的话需要重新编写。可以使用cmake进行makefile的构建
    • cmake根据CMakeLists.txt生成makefile

“gcc” --> make(makefile) -->cmake(CMakeLists.txt)

cmake构建过程

cmake . # 会在当前目录下找CMakeLists.txt
make # 根据cmake生成的makefile进行编译构建

学习链接

CMake语法介绍

指令大小写无关,里面的内容大小写有关

project指令

可以用来指定工程的名字和支持的语言,默认支持所有语言

project(HELLO)  # 指定工程名为HELLO,支持所有语言

SET指令

相当于定义变量

set(SRC_LIST main.cpp a.cpp)

MESSAGE指令

向终端输出用户自定义的信息

message(STATUS "This is BINARY dir" ${HELLO_BINARY_DIR})
  • FATAL_ERROR:cmake出现错误,停止处理并生成,就是这个message有exit的效果。
  • SEND_ERROR:出错,继续处理,但不会生成。
  • WARNING:发出警告,继续处理。
  • AUTHOR_WARNING:CMake Warning (dev),继续处理。
  • DEPRECATION:如果CMAKE_ERROR_DEPRECATED或CMAKE_WARN_DEPRECATED变量分别被启用,则为CMake Deprecation Error或Warning,否则没有消息。
  • (none) or NOTICE:重要信息打印到stderr以引起用户的注意。
  • STATUS:项目用户可能感兴趣的主要消息。理想情况下,这些信应该简明扼要,不超过一行,但仍能提供信息。
  • VERBOSE:针对项目用户的详细信息消息。这些消息应该提供在大多数情况下不感兴趣的额外细节,但是对于那些构建项目的人来说,当他们想要更深入地了解正在发生的事情时,这些细节可能会很有用。
  • DEBUG:详细的信息性消息,用于开发人员处理项目本身,而不是只想构建项目的用户。这些消息通常不会引起构建项目的其他用户的兴趣,并且通常与内部实现细节密切相关。
  • TRACE:具有非常低级实现细节的细粒度消息。使用此日志级别的消息通常只是临时的,并且在发布项目、打包文件等之前预期会被删除。

ADD_EXECUTABLE指令

生成可执行文件

add_executable(hello ${src_list})
# hello是可执行文件名,后面是所需要的源文件

ADD_SUBDIRECTORY指令

add_subdirectory(src bin) # 源文件在src,生成的二进制文件在bin目录(在进行cmake命令的目录下会自行创建)

ADD_LIBRARY指令

set(share_list hello.cpp)
add_library(hello SHARED|STATIC ${share_list}) 
# hello是生成的第三方库的名称,但是最后的名称是libhello.so

SET_TARGET_PROPERTIES指令

设置输出文件的一些属性,比如生成文件最后的名字

ADD_LIBRARY (hello_static STATIC ${LIBHELLO_SRC})
SET_TARGET_PROPERTIES (hello_static PROPERTIES OUTPUT_NAME "hello")

INCLUDE_DIRECTORIES指令

include_directories(path) # 添加头文件的搜索路径

LINK_DIRECTORIES指令

link_directories(path) # 添加第三方二进制执行库的搜索路径

CMake内部构建与外部构建

操作是,在源文件下新建一个build目录,进入build目录。可以使得编译构建过程所生成的中间文件放在build文件夹中

cmake ..  # 当前在的目录是编译路径,后面跟的是源文件目录
<projectname>_BINARY_DIR # 编译路径
<projectname>_SOURCE_DIR # 源文件路径

这个内部和外部的说法应该是相对于源文件来说的

CMake进行安装

就是将生成的二进制文件以及帮助文档安装到对应的路径下

install(TARGETS <target>... [...])             # 目标文件的安装,可执行二进制、动态库、静态库
install({FILES | PROGRAMS} <file>... [...])    # FILES普通文本文件,PROGRAMS非目标的可执行程序
install(DIRECTORY <dir>... [...])    # 将一个或多个目录的内容安装到给定的目的地。如果最后有/表示其中的内容而不包括目录本身
install(SCRIPT <file> [...])                   # 安装过程中调用给定的CMake脚本(.cmake脚本文件)
install(CODE <code> [...])                     # 安装过程中调用给定的CMake指令
install(EXPORT <export-name> [...])
# 在使用路径的时候如果使用相对路径,默认是/usr/local/路径,更改需要依照CMAKE_INSTALL_PREFIX变量
# cmake -DCMAKE_INSTALL_PREFIX=/usr ..

示例

➜  cmakestudy tree
.
|-- CMakeLists.txt
|-- build
`-- src
    |-- CMakeLists.txt
    `-- main.cpp

2 directories, 3 files
install(TARGETS hello DESTINATION src) # 将目标可执行文件hello安装到src目录中
cmake -DCMAKE_INSTALL_PREFIC=../ ..   # 在build目录下运行
make
make install

猜你喜欢

转载自blog.csdn.net/weixin_46287316/article/details/128606955