cmake的基础概念,语法特性,Cmake重要指令,编译过程

1.基础概念
  • CMake是一个跨平台的安装编译工具,可以用简单的语句来描述所有平台的安装(编译过程)
  • CMake可以说已成为大部分c++开源项目标配
2.语法特性介绍
  • 基本语法格式:指令(参数1 参数2 …)

    ​ 参数使用括弧括起来

    ​ 参数之间使用空格分号分开

  • 指令是大小写无关,参数和变量是大小写相关的

set(HELLO hello.cpp)
add_executable(hello main.cpp hello.cpp)
ADD_EXECUTABLE(hello main.cpp ${HELLO})
  • 变量使用 方式取值,但是在 I F 控制语句中是直接使用变量名,如 i f ( {}方式取值,但是在IF控制语句中是直接使用变量名,如if( 方式取值,但是在IF控制语句中是直接使用变量名,如if({hello}) 错误的 应该是 if(hello)
3.CMake重要指令
  • cmake_minimum_required ----- 指定CMake的最小版本要求

    语法:cmake_minimum_required(VERSION versionNumber [FATAL_ERROR])

#CMake 最小版本要求为2.8.3
cmake_minimum_required(VERSION 2.8.3)
  • project ------- 定义工程名称,并可指定工程支持的语言

    语法:project(projectname [cxx] [c] [java])

    #指定工程名为 HELLOWORLD
    project(HELLOWORLD)
    
  • set ------ 显示的定义变量

    语法:set(VAR[][][VALUE] [CACHE TYPE DOCSTRING] [FORCE])

    #定义src变量 其值为sayhello.cpp hello.cpp
    set(SRC sayhello.cpp hello.cpp) #意思是 src代表上面两个cpp文件
    
  • include_directories ----- 向工程添加多个特定的头文件搜索路径------相当于指定g++编译器的-l参数

    语法:include_directories([AFTER|BEFORE] [SYSTEM] dirr1 dir2…)

    #将 /user/include/myincludefolder 和 ./include 添加到头文件搜索路径
    include_directories(/user/include/myincludefolder  ./include)
    
  • link_directories ----- 向工程添加多个特定的库文件搜索路径 — 相当于g++编译器-L参数

    语法:link_directories(dir1 dir2 …)

    #将 /user/include/myincludefolder 和 ./include 添加到库文件搜索路径
    link_directories(/user/include/myincludefolder  ./include)
    
  • add_library ---- 生成库文件

    语法:add_library(libname [SHARED(动态库)|STATIC(静态库)|MODULE] [EXCLUDE_FROM_ALL] source1 source2…)

#通过变量SRC生成libhello.so共享库
add_library(hello SHARED ${SRC})
  • add_compile_options----添加参数

    语法:add_compile_options(…)

    #添加编译参数 -wall -std = c++11 -o2
    add_compile_options(-wall -std = c++11 -o2)
    
  • add_executable ------生成可执行文件

    语法:add_executable (exname source1 source2…)

    #编译main.cpp生成可执行文件 main
    add_executable(main main.cpp)
    
  • target_link_libraries — 为target添加需要连接的共享库----相当于指定g++编译器-l参数

    语法:target_link_libraries (target library1<debug|optimized> library2…)

    #将hello动态库文件链接到可执行文件main
    target_link_libraries(main hello)
    
  • add_subdirectory ---- 向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置

    语法:add_subdirectory (source_dir[binary_dir] [EXCLUDE_FROM_ALL])

    #添加src子目录,src中需要有一个CMakeLists.txt
    add_subdirectory (src)
    
  • aux_source_directory ----发现一个目录下所有的源代码文件并将文件列表存储在一个变量中,这个指令临时被用来自动构建源文件列表

    语法:aux_source_directory (dir VARIABLE)

    #定义SRC变量,其值为当前目录下所有的源代码文件
    aux_source_directory(. SRC)
    #编译SRC变量所代表的的源代码文件,生成main可执行文件
    add_executable(main ${SRC}) 
    
4.CMake编译工程

CMake目录结构:项目主目录存在一个CMakeLists.txt文件

两种方式设置编译规则

  1. 包含源文件的子文件夹包含CMake.txt文件,主目录的CMakeLists.txt通过add_subdirectory添加子目录
  2. 包含源文件的子文件夹未包含CMake.txt文件,子目录编译规则体现在主目录的CMakeLists.txt中
4.1编译流程

在Linux平台下使用CMake构建C/C++工程的流程如下:

  • 手动编写CMakeLists.txt
  • 执行命令cmake PATH生成MakeFile(PATH 是顶层CMakelists.txt所在的目录)
  • 执行命令make进行编译

小细节

#important tips
.   #表示当前目录
./	#表示当前目录

..	#表示上级目录
../	#表示上级目录

4.2两种构建方式
  • 内部构建(in-source build):不推荐使用
##内部构建

#在当前目录下,编译本目录的CMakeLists.txt,生成Makefile和其他文件
cmake .
#执行make命令 生成target
make
  • 外部构建(out-of-source build):推荐使用

将编译输出文件与源文件放到不同目录中

##外部构建

#1.在当前目录下创建build文件夹
	mkdir build
#2.进入到build文件夹
	cd build 
#3.编译上级目录的CMmakeListis.txt 生成Makefile和其他文件
	camke ..
#4.执行make命令 生成target
	make
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Unknown To Known

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值