当只有单个源文件时,可以用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