Hippogriff's Blog
首页
C++
  • 算法
  • 数据结构
  • Leetcode
  • 操作系统
  • 计算机网络
  • MySQL
  • 深度学习
  • 网络
收藏
  • 醍醐灌顶
  • 句读
个人书单 (opens new window)
GitHub (opens new window)

Absm

什么也不会
首页
C++
  • 算法
  • 数据结构
  • Leetcode
  • 操作系统
  • 计算机网络
  • MySQL
  • 深度学习
  • 网络
收藏
  • 醍醐灌顶
  • 句读
个人书单 (opens new window)
GitHub (opens new window)
  • 【C++&Leetcode】自定义排序的方法与辨析
  • 关于优先队列priority_queue
  • 关于C++ STL size的坑
  • C++ 智能指针
  • C++ const
  • C++&STL中String常见函数用法
  • C++11的decltype
  • C++11右值引用【来自IBM文档】
  • C++11中循环auto的引用
  • C++中的lambda表达式
  • C风格字符串库函数总结
  • C与C++风格的字符串辨析
  • CMake基础命令
    • 构建makefile和编译、链接
    • 版本号与工程名
      • CMake版本号
      • 工程及其版本号
    • 设置C++版本
    • 定义变量
    • 源文件与对应的可执行文件
    • 指明有源文件的子目录
    • 构建静态库与动态库
    • 添加共享库
  • C++
Absm
2021-11-08
目录

CMake基础命令

# CMake常用命令

作为学习时的记录,附加了简单的分析。

# 构建makefile和编译、链接

一般来说,采用外部构建策略,即拆分源码和build临时文件。方法很简单,就是在工程汇总增加build文件夹,在这里面进行构建makefile的操作。

cd proj_name/build
1

然后生成makefile

cmake ..
1

此时就生成了对应的makefile文件,再进行编译和链接,此时可以执行

make
1

或者使用cmake的语法

cmake -build .
1

至此就生成了对应的二进制文件,然后执行即可。

# 版本号与工程名

# CMake版本号

cmake_minimum_required(VERSION 3.10)
1

该命令指明了运行该cmake程序需要的最小版本号,

# 工程及其版本号

project(MyProject VERSION 1.0)
1

这句话指明了:

  • 工程的名称是MyProject
  • 版本是1.0(可以省略)

# 设置C++版本

即选择构建、编译链接等过程中遵循的C++标准究竟是C++ 11还是C++20或其他版本。

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
1
2

# 定义变量

在上一小节中出现了关键字set,它的作用就是显示地定义一个变量,或者为变量赋值。

简化的语法是

set(VAR [VALUE])
1

后也即可以为定义VAR,并赋值为VALUE

# 源文件与对应的可执行文件

利用下面的命令

add_executable(hello main.c func.c)
1

这说明文件会生成一个名为hello的文件,它对应的源文件是main.c func.c等。

其中第一个是生成的文件名,后面则是源文件列表。

# 指明有源文件的子目录

比如某些情况下,当工程比较大时,整个工程的结构需要如下所示:

  • MyProject
    • doc - 存放文档
    • src - 存放源码
    • build - 存放构建的临时文件
      • bin - 存放二进制文件
    • README
    • CMakeFiles.txt

上述的操作可以用下面的方法实现:

add_subdirectory(src bin)
1

这句话的意思是,

  • src是一个子文件夹,它是存放源文件的文件夹。
  • bin表示由该文件夹中的二进制文件存放位置为./bin/,注意是此时的相对路径。(也可以写成绝对路径)

# 构建静态库与动态库

一般用cpp写的模块都不是直接执行,而是作为某个静态库或动态库来加载。要生成这个动态库和静态库(而不只是一个可执行的二进制文件)需要对应的命令:

add_library(hello SHARED ${LIBHELLO_SRC})
1
  • 生成的库名为hello
  • 生成的库是动态(其中第二个变量可以是:SHARED、STATIC、MODULE)
  • LIBHELLO_SRC指明了生成库的路径

为了生成静态库,则使用下面的命令:

add_library(hello STATIC ${LIBHELLO_SRC})
1

但是,一个问题是同时使用上述两个命令会失败一个,因为名字是相同的。一个比较简单的方法是使用不同的名字。

# 添加共享库

添加非标准的文件搜索路径(告诉编译器,通常用于头文件)

include_directories(/usr/include/hello)
1

添加非标准的共享库搜索路径(告诉链接器,用于共享库)

link_directories(directory1)
1

为执行目标link到共享库

target_link_libraries(target library1)
1
编辑 (opens new window)
上次更新: 2021/11/08, 14:32:39
C与C++风格的字符串辨析

← C与C++风格的字符串辨析

最近更新
01
少年游·长安古道马迟迟
11-30
02
由浅入深剖析OAuth2.0的授权码模式
07-07
03
spring笔记之IoC
06-18
更多文章>
Theme by Vdoing | Copyright © 2019-2023 Murray Li | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×