cmake基本语法结构

markdown 复制代码

文章目录

CMake

是什么

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

语法

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

基本初始化

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)  # 要求编译器支持该标准

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

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

注释

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

cmake 复制代码
#

链接第三方库

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

不需要手动的指定路径

手动指定安装路径
cmake 复制代码
# 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 复制代码
#CMAKE_CURRENT_SOURCE_DIR:当前 CMakeLists.txt 所在目录的路径(独特不会发生变化)
#CMAKE_CURRENT_BINARY_DIR:当前目录对应的构建输出目录路径
#CMAKE_RUNTIME_OUTPUT_DIRECTORY:可执行文件输出目录
#CMAKE_LIBRARY_OUTPUT_DIRECTORY:动态库输出目录
#CMAKE_ARCHIVE_OUTPUT_DIRECTORY:静态库输出目录

使用方法

cmake 复制代码
set(CMAKE_CURRENT_BINARY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/bin)

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

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

cmake 复制代码
# 指定 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 #链接的库名称
)
相关推荐
余槐i2 小时前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
数据库小学妹2 小时前
PostgreSQL表膨胀怎么办?autovacuum清不动的根因与排查命令
数据库·postgresql·表膨胀·mvcc·数据库运维
mister_guo2 小时前
MySQL-1267错误:排序规则冲突的原因与解决方案
数据库·mysql
骇客野人3 小时前
在麒麟操作系统上 分别安装 jdk1.8, 达梦数据库,redis ,memcache 的操作实施方案和步骤
数据库·redis·memcached
美狐美颜SDK开放平台4 小时前
直播APP如何实现美白滤镜功能?视频美颜SDK技术开发方案详解
前端·数据库·人工智能·音视频·美颜sdk·直播美颜sdk·视频美颜sdk
WL学习笔记5 小时前
C & C++ 内存管理
c++·c++内存管理
花间相见6 小时前
【计算基础|MySQL01】【上手】安装连接、数据类型与建库建表
数据库·后端
花间相见6 小时前
【计算基础|MySQL02】【上手】SQL 增删改查
数据库·后端
ITxiaobing20236 小时前
IP 库与 AppsFlyer 国家/地区数据不一致,如何系统地对账?
数据库·网络协议·tcp/ip
这个DBA有点耶6 小时前
从时间到语义:时序数据库与向量数据库的核心机制、选型与多模融合趋势
数据库·mysql·架构