cmake基本语法结构

CMake

是什么

CMake是管理源代码的构建工具,可以使用在Visual Studio,Visual Studio Code,CLion,和Xcode项目文件。不仅可以构建C/C++,其他的语言也可以用来构建。


语法

介绍所以的CMAKE的语句的使用


基本初始化

# 指定 CMake 最低版本(推荐 3.10 或更高)
cmake_minimum_required(VERSION 3.10)

# 项目名称、版本  MyApp为项目名称
project(MyApp VERSION 1.0 LANGUAGES CXX)

# 设置 C++ 标准(例如 C++17)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)  # 要求编译器支持该标准

编译成为不同的文件的语句

编译成为可执行文件

#${PROJECT_NAME}使用这个来代替MyApp,改了前面的基本初始化的名称,就不需要更改参数设置
#这里添加的是main.cpp的文件
add_executable(${PROJECT_NAME}
        main.cpp
)
编译成为动态库
# 将mylib.cpp编译为动态库MyLib(Windows下生成MyLib.dll,Linux下生成libMyLib.so)
add_library(MyLib SHARED src/mylib.cpp)
编译成为静态库
# 生成静态库(STATIC)
add_library(MyLibStatic STATIC src/mylib.cpp)

注释

使用#作为注释,进行内容的书写

#

链接第三方库

使用包管理工具
# 查找 OpenCV 库(最低版本 4.0,需要 core 和 imgproc 组件)
find_package(OpenCV 4.0 REQUIRED COMPONENTS core imgproc)
# 链接到自己的目标,链接库组件
target_link_libraries(myapp PRIVATE OpenCV::core OpenCV::imgproc)

不需要手动的指定路径

手动指定安装路径
# 1. 指定头文件目录
target_include_directories(目标名称
  PRIVATE
  /path/to/thirdparty/include  # 第三方库的头文件路径
)

# 2. 指定库文件目录
target_link_directories(目标名称
  PRIVATE
  /path/to/thirdparty/lib  # 第三方库的库文件路径
)

# 3. 链接具体库
target_link_libraries(目标名称
  PRIVATE
  库名  # 如 libxxx.so 或 libxxx.a 只需写 xxx
)

常用的变量

#CMAKE_CURRENT_SOURCE_DIR:当前 CMakeLists.txt 所在目录的路径(独特不会发生变化)
#CMAKE_CURRENT_BINARY_DIR:当前目录对应的构建输出目录路径
#CMAKE_RUNTIME_OUTPUT_DIRECTORY:可执行文件输出目录
#CMAKE_LIBRARY_OUTPUT_DIRECTORY:动态库输出目录
#CMAKE_ARCHIVE_OUTPUT_DIRECTORY:静态库输出目录

使用方法

set(CMAKE_CURRENT_BINARY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/bin)

我把可执行文件的输出目录设置在CMakeLists.txt下面的bin目录下面,这里的${}本质的含有是解引用的内容。(这里的设置信息应该放在编译成为编译成为不同的文件语句前面,要不然设置信息不会生效)

可以使用的CMakeLists.txt成熟的语法

# 指定 CMake 最低版本(推荐 3.10 或更高)
cmake_minimum_required(VERSION 3.10)

# 项目名称、版本  MyApp为项目名称
project(Test VERSION 1.0 LANGUAGES CXX)

# 设置 C++ 标准(例如 C++17)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)  # 要求编译器支持该标准



#${PROJECT_NAME}使用这个来代替MyApp,改了前面的基本初始化的名称,就不需要更改参数设置
add_executable(${PROJECT_NAME} 
        main.cpp  #添加可执行文件
)

# 1. 指定头文件目录
target_include_directories(${PROJECT_NAME}
  PRIVATE
  ${CMAKE_CURRENT_SOURCE_DIR}/opencv343/include  # 第三方库的头文件路径
)

# 2. 指定库文件目录
target_link_directories(${PROJECT_NAME}
  PRIVATE
  ${CMAKE_CURRENT_SOURCE_DIR}/opencv343/lib  # 第三方库的库文件路径
)

# 3. 链接具体库
target_link_libraries(${PROJECT_NAME}
  PRIVATE
  opencv_world343d.lib #链接的库名称
)
### CMake 基础语法教程 #### 创建项目并指定最低版本 为了确保使用的CMake版本不低于某个特定版本,在`CMakeLists.txt`文件中应指明最小所需版本。这有助于防止旧版CMake可能带来的兼容性问题。 ```cmake cmake_minimum_required(VERSION 3.10) ``` #### 定义项目名称和可选的语言列表 通过`project()`函数来声明当前工程的名字以及所涉及编程语言种类,这对于后续配置过程非常重要。 ```cmake project(MyProject VERSION 1.0 LANGUAGES CXX) ``` #### 添加子目录下的源码树 当项目结构较为复杂时,可以通过`add_subdirectory()`指令引入其他子目录内的资源参与编译流程。 ```cmake add_subdirectory(src) ``` #### 构建可执行目标 对于每一个想要创建出来的最终运行程序而言,都需要调用一次`add_executable()`命令,并传入相应的参数说明该应用程序由哪些部分组成。 ```cmake add_executable(myapp main.cpp utils.cpp) ``` #### 设置变量值 利用`set()`语句能够方便快捷地给定某些预设常量或者路径字符串等信息供后面环节引用。 ```cmake set(CMAKE_CXX_STANDARD 17) ``` #### 文件操作 如果涉及到具体文件处理的话,则可以借助于`file()`来进行诸如复制粘贴之类的动作;也可以用来获取工作空间内所有符合条件的目标集合。 ```cmake file(GLOB_RECURSE SOURCES "src/*.cpp") ``` #### 库的添加与链接 针对静态库/动态库的情况分别有对应的`add_library()`方法去注册新的共享对象或是存档包形式存在;而要让这些第三方依赖项关联到前面提到过的exe上面就要依靠`target_link_libraries()`实现连接关系建立。 ```cmake add_library(mylib STATIC libsource.c) target_link_libraries(myapp PRIVATE mylib) ``` #### 头文件包含路径设置 为了让编译器知道去哪里寻找头文件,应该使用`target_include_directories()`设定好公共接口暴露位置以及其他私有的内部实现细节所在之处。 ```cmake target_include_directories(myapp PUBLIC ${PROJECT_SOURCE_DIR}/include) ``` #### 查找外部软件包的支持情况 最后一点就是关于如何检测是否存在必要的环境组件——比如Boost、Qt之类大型框架的时候,往往需要用到专门设计好的宏定义`find_package()`, 这样做不仅简化了代码逻辑而且提高了移植效率. ```cmake find_package(Threads REQUIRED) if ( Threads_FOUND ) target_link_libraries(myapp Threads::Threads) endif() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值