VScode环境下使用CMake构建工程

2023-05-16

简介

VS code环境下使用CMake构建工程

  1. 导入VScode cmake工程
  2. C/C++多文件工程构建
  3. 制作静态/动态链接库文件
  4. 使用外部库文件构建工程
  5. CMake常用指令
  6. 填坑

本文主要介绍vscode环境下使用CMake构建工程的详细用法,包含多文件工程的构建,静态链接库/动态链接库文件的生成,外部库文件的使用。

0.导入VScode cmake工程

首先创建一个C/C++工程文件夹,用VSCode打开,目录结构如下:
1、使用快捷键Ctrl+Shift+P打开vscode 的控制面板。输入CMake:quick start
在这里插入图片描述
2、随后在弹出的窗口中选择GCC,如果没有弹出,则按住Ctrl+Shift+P,输入CMake: Select a kit 后选择
在这里插入图片描述
如果选错了,可以用以下方式更换
在这里插入图片描述

3 .编译运行
在这里插入图片描述
补充: 如需要,断点debug调试步骤
在这里插入图片描述
单步运行
在这里插入图片描述

1. C/C++多文件工程构建

工程目录结构如下,将头文件放在include中,.c文件放在src目录下,每一个包含源文件(.c/.cpp)的文件夹如果工程需要使用,则都需要通过add_subdirectory的方式添加到工程中。项目的根目录下需要有一个CMakeLists.txt,用来配置工程信息,建立和子目录的联系,每一个包含源码的子目录也都需要一个CMakeLists.txt

D:.
│  CMakeLists.txt
│  main.c
├─build
├─include
│      hello.h
└─src
        CMakeLists.txt
        hello.c

在工程目录下mian.c文件中调用src文件下的hello.c文件中的函数
hello.h文件放在include 文件夹中
工程中的CMakeLists.txt文件如下

cmake_minimum_required(VERSION 3.0.0)
project(multiFileTest VERSION 0.1.0)

include(CTest)
enable_testing()

#包含头文件
include_directories(include)

#工程目录下的原文件,命名为ROOT_SOURCE
aux_source_directory(. ROOT_SOURCE)

#指定一个子目录src,制定了src,cmake才回去src中找CMakeList
add_subdirectory(src)

#添加可执行文件,生成一个目标文件,取名为hello
add_executable(hello ${ROOT_SOURCE} ${HELLO_SRC})

set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)

src子目录下的CMakeLists.txt内容如下

#子目录下的源文件,取名为HELLO_SRC,让父级目录可见
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} HELLO_SRC)
set(HELLO_SRC ${HELLO_SRC} PARENT_SCOPE)

2. 制作静态/动态链接库文件

工程目录结构如下

D:.
│  CMakeLists.txt
├─build
└─lib
        CMakeLists.txt
        myhello.c
        myhello.h

hello.chello.h编译成静态和动态链接库文件,供外部使用

工程目录下的CMakeLists.txt内容如下,只用包含注释的两句话是必要的,后面的install可安装也可不安装:

cmake_minimum_required(VERSION 3.0.0)
#工程设置
project(myhello VERSION 0.1.0)

include(CTest)
enable_testing()

#包含源文件,生成的可执行文件放在bin文件中
add_subdirectory(lib bin)

set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)

install(FILES hello.h DESTINATION include/hello)
install(TARGETS hello hello_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)

lib目录下的CMakeLists.txt内容如下,同时生成动态库和静态库:

set(LIB_SRC  myhello.c)

add_library(hello_static  STATIC ${LIB_SRC})

set_target_properties(hello_static PROPERTIES OUTPUT_NAME "hello" )
set_target_properties( hello_static PROPERTIES CLEAN_DIRECT_OUTPUT 1 )

add_library(hello SHARED ${LIB_SRC})
set_target_properties(hello PROPERTIES OUTPUT_NAME "hello")
set_target_properties( hello PROPERTIES CLEAN_DIRECT_OUTPUT 1 )

这个实例是使用C文件做的库,在C++中调用,.c和.h文件内容如下

//.c文件如下
#include  "myhello.h"
#include  <stdio.h>

void  helloFun()
{
    printf("helloWorld!");
}

//.h文件如下
#ifndef  _MYHELLO_H
#define  _MYHELLO_H

#ifdef  __cplusplus
extern "C"{
 #endif

extern  void  helloFun(void);

#ifdef  __cplusplus
}
#endif

#endif

编译链接之后生成了libhello.alibhello.dll

3. 调用外部库文件构建工程

工程目录结构如下:

D:.
│  CMakeLists.txt
│  main.cpp
├─build
├─include
│      myhello.h
└─lib
        libhello.a
        libhello.dll

工程目录下的main.cpp内容如下:

#include <iostream>
#include "myhello.h"

//如果是windows环境下需要指明库的位置
#pragma comment(lib, "lib/libhello.lib")

int main(int, char**) {
    helloFun();
}

注意生成的可执行文件必须和库文件放一起,才能正常运行
在这里插入图片描述

工程目录下的CMakeLists.txt内容如下:

cmake_minimum_required(VERSION 3.0.0)
project(mytest VERSION 0.1.0)

include(CTest)
enable_testing()

include_directories(include)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin)

LINK_DIRECTORIES(lib)

add_executable(mytest main.cpp)

target_link_libraries(mytest libhello.dll)

set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)

4. CMake常用指令

#设置最低cmake版本
#该指令指定cmake的最低版本,如果低于指定版本,则出现错误,整个过程终止
cmake_minimum_required(VERSION 3.0.0)

#配置项目信息
#设置项目名称
project(mytest VERSION 0.1.0)

#搜索当前目录下所有源文件
#原型:AUX_SOURCE_DIRECTORY(dir VARIABLE)
#该指令用于发现一个目录下所有的源代码文件并将列表存储在一个变量中
aux_source_directory(. ROOT_SOURCE)

# 包含头文件  (具有全局效果)
# 给工程添加头文件,例如使用opencv时需要包含/usr/local/include/opencv/cv.h这个头文件,则我们需要
# include_directories(/usr/local/include),在调用的函数里写 #include “opencv/cv.h”即可
include_directories(include)

#为指定的目标添加搜索头文件
# target_include_directories(<target> <PUBLIC|INTERFACE|PRIVATE]> <items>):为特定的目标链接头文件目录。
# 我们将${OpenCV_Include_dir}头文件库路径只添加到了mytest项目
target_include_directories(mytest PUBLIC ${OpenCV_Include_dir}#包含链接库目录
LINK_DIRECTORIES(lib)

#包含工程子目录
#该指令用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置。
#原型: ADD_SUBDIRECTORY(source_dir [binary_dir]
add_subdirectory(src)

#生成可执行文件                  
#原型: ADD_EXECUTABLE(程序名 源代码文件)  or add_executable(可执行文件名 1.cpp 2.ppp …)
add_executable(mytest main.cpp)

#生成静态链接库       
#原型:ADD_LIBRARY(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 source2 ... sourceN)
add_library(hello_static  STATIC ${LIB_SRC})

#生成动态链接库
add_library(hello SHARED ${LIB_SRC})

#链接库文件,注意链接库文件必须在生成可执行文件之后
#为库或者可执行文件添加需要链接的库
#原型:target_link_libraries (库/可执行文件 library1 library2 ...)
target_link_libraries(mytest libhello.dll)

#配置编译类型
#给变量赋值为参数,这里的变量可以CMake自己变量也可是自己定义的变量
#原型:set (变量 参数)
set(CMAKE_BUILD_TYPE Debug)

# 编译选项:
add_compile_options(-std=c++11)
# 如果想要指定具体的编译器的选项,可以使用make_cxx_flags()或cmake_c_flags()。

补充:cmake命令详细补充说明

1.set命令

set (变量 参数)

给变量赋值为参数,这里的变量可以CMake自己变量也可是自己定义的变量

CMake常用变量

  1. CMAKE_BUILD_TYPE:CMake编译类型,常用参数如下

    Debug: 调试模式,输出调试信息,不做优化
    Release: 发布模式,没有调试信息,全优化
    RelWithDebInfo::类似Release, 但包括调试信息
    MinSizeRel: 一种特殊的Release模式,会特别优化库的大小

    例:set (CMAKE_BUILD_TYPE Debug) 设置编译类型为Debug模式

  2. CMAKE_CXX_FLAGS:对C++代码编译过程进行设置,常用参数如下:
    –std=c++11 :支持C++11标准
    -Wall :编译过程输出警告信息
    -O3 :使用o3等级优化 注:优化等级越高,生成可执行文件越少,但可能会优化 掉一些需要的函数,如果实际测试发现一个应该执行到的函数没有执行可能是优化器给优化掉了,需要降低优化等级或者直接 -O0(不优化)
    -march=native :加了该参数,编译器将自动检测CPU型号,并使用该型号的增强指令集,比如各个版本的SSE AVX等,编译时编译器将优先使用这些增强指令集替代原始指令集,达到更快的执行效率。但往往这块儿会存在一些问题。

    如果安装第三方库开启了-march=native,则调用第三方库的工程里必须也得加 -march=native,因为使用增强指令值时要求操作数需要按照一定格式在内存储存,如4字节对齐或者16字节对齐或者其他形式,如果不加-march=native操作数将采用默认形式,就会报错。

    可执行文件的可移植性降低,如果电脑A使用-march=native编译,将可执行文件送给电脑B,如果电脑B和电脑A支持的增强指令集不一样,则会执行不了,电脑B需要使用源码进行重新编译生成可执行文件。

    例:set(CMAKE_CXX_FLAGS " C M A K E C X X F L A G S − W a l l − O 3 − m a r c h = n a t i v e " ) 注:例子里添加 {CMAKE_CXX_FLAGS} -Wall -O3 -march=native") 注:例子里添加 CMAKECXXFLAGSWallO3march=native")注:例子里添加{CMAKE_CXX_FLAGS}表示在CMAKE_CXX_FLAGS原有的基础上新增-Wall -O3 -march=native这些指令,如果不加${CMAKE_CXX_FLAGS},则会覆盖掉CMAKE_CXX_FLAGS 原有的配置。

  3. CMAKE_C_FLAGS:对C代码编译过程进行设置,用法类似于CMAKE_CXX_FLAGS

  4. CMAKE_CXX_STANDARD C++标准,如set (CMAKE_CXX_STANDARD 11)

  5. LIBRARY_OUTPUT_PATH :指定生成库输出路径,如SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

2.message命令

定义
MESSAGE关键字主要用于向终端输出用户自定义的信息,主要包含三种信息
SEND_ERROR,产生错误,生成过程被跳过
STATUS,输出前缀为–的信息
FATAL_ERROR,立即终止所有cmake过程

功能:打印日志
例如: MESSAGE(STATUS “current platform: Windows”)
在这里插入图片描述

3.option的命令

功能
cmake中option起到编译开关的作用,CMakeLists.txt中option以前的语句,变量按未定义处理,option之后的语句,变量才被定义。另外,注意,option命令定义的变量不影响c或c++源码中#ifdef或者#ifndef逻辑判断
原型
option( “<help_text>” [value])
举例

PROJECT(HELLO)

IF(TEST)
	MESSAGE("1########TEST is defined,vlaue:${TEST}")
ELSE()
	MESSAGE("1########TEST is not defined")
ENDIF()
 
#command option
option(TEST "test affect to code" ON)


ADD_SUBDIRECTORY(lib bin)

IF(TEST)
	MESSAGE("2#######TEST is defined,vlaue:${TEST}")
ELSE()
	MESSAGE("2#######TEST is not defined")
ENDIF()

build是cmake编译路径,为了便于在出错时清理缓存文件,执行命令如下

cd build
cmake ..      #等效于 cmake -D TEST=ON ..

输入如下

$ cmake -D TEST=OFF ..

在这里插入图片描述

$ cmake -D TEST=ON ..

在这里插入图片描述

5. 填坑

在vscode下使用CMake构建工程,使用cmake quick start之后,自动生成了main.cpp文件,CMakeLists.txt文件和build文件夹,在构建工程的过程中不要删除build文件夹,如果删除之后重新建build文件夹,然后cmake…,则会出现错误:

The CMAKE_C_COMPILER:
    cl
is not a full path and was not found in the PATH.

编译器找不到了,这是则需要重新配置cmake工程,右键CMakeLists.txt,清除项目重新配置即可

调试过程中,在build文件下编译链接,不要删除build文件夹的内容

使用外部链接库文件时,如果提示使用的函数未定义,检查目标文件是否链接库target_link_libraries

undefined reference to .......

如果提示找不到库,检查库文件路径是否包含,LINK_DIRECTORIES

cannot find -lhello ......

找不到头文件,检查头文件是否包含

No such file or directory
 #include "myhello.h"
          ^~~~~~~~~~~

_link_libraries`

undefined reference to .......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VScode环境下使用CMake构建工程 的相关文章

  • IDEA配置Tomcat

    IntelliJ IDEA 2017 配置Tomcat 运行Web项目 以前都用MyEclipse写程序的 突然用了IDEA各种不习惯的说 借鉴了很多网上好的配置办法 xff0c 感谢各位大神 前期准备 IDEA JDK Tomcat请先在
  • 如何实现页面登录验证

    现在很多网站在登录的时候都需要输入验证码 xff0c 现在输入的验证码方式层出不穷有单单是数字的 字母 xff08 又分大小写 xff09 的 xff0c 有数字 字母混合的 xff0c 有给出运算表达式需要回答结果的 xff0c 还有的卡
  • REST,RESTful到底是个什么?

    0 REST不是 34 rest 34 这个单词 而是几个单词缩写 但即使那几个单词说出来 也无法理解在说什么 不是要贬低人 是我自己也理解困难 1 REST描述的是在网络中client和server的一种交互形式 REST本身不实用 实用
  • spring boot 入门

    什么是 spring boot Spring Boot是由Pivotal团队提供的全新框架 xff0c 其设计目的是用来简化新Spring应用的初始搭建以及开发过程 该框架使用了特定的方式来进行配置 xff0c 从而使开发人员不再需要定义样
  • html如何使用springboot进行跳转

    问题 xff1a 页面之间的跳转 xff0c 通常带有值的传输 xff0c 但是 xff0c 在现在比较流行的SPRING MVC WEB 开发模型中 xff0c 设计机制导致页面之间的直接接跳转和传值不被支持 xff08 网上看到的 xf
  • PowerShell升级

    PowerShell升级 1 查看版本 span class token variable PSVersionTable span 2 搜索软件包 winget search Microsoft PowerShell 3 使用 id 参数安
  • 四子棋对决(一)

    1 算法一 cc Class extends cc Component properties overLab default null type cc Label chessPrefab 棋子的预制资源 default null type
  • 四子棋对决(二)

    import com from 39 common 39 cc Class extends cc Component properties overLab default null type cc Label chessPrefab 棋子的
  • 四子棋对决(三)

    客户端 开始场景 xff1a menuScript js import global from 39 global 39 var com 61 require 39 common 39 cc Class extends cc Compone
  • centos 7怎么通过图形界面来配置静态ip

    除了通过修改配置文件的方法来配置静态ip 我们还可以通过图形界面来配置 xff0c 这样做其实更加方便一点 1 先点击应用程序 xff0c 点击系统工具 xff0c 点击设置 2 选择网络 3 打开网络 xff0c 点击设置 4 选择ipv
  • JavaScript

    JavaScript 一 JavaScript输入输出语句 JavaScript提供了一些输入输出语句 xff1a 方法说明归属alert msg 浏览器弹出警示框浏览器console msg 浏览器控制台输出信息浏览器prompt inf
  • th tr td区别

    tr定义行 th表示头部 td表示单元格 tr不能单独存在 xff0c 相当于table的属性标签 xff0c 而th td也应当放在tr中 lt th gt 不光是粗体 xff0c 还是居中的 lt DOCTYPE html gt lt
  • --12月月赛题解--

    12月月赛题解 问题 A 求区间最大值 题目描述 给你一个长度为n的序列 a 1 a 2 a n 下标从1到n Q个询问 每次询问给出一个L和R 你需要输出最大的a i L lt 61 i lt 61 R 输入 单组数据 第一行给出n n
  • Week9 作业 A - 咕咕东的目录管理器

    题面 咕咕东的雪梨电脑的操作系统在上个月受到宇宙射线的影响 xff0c 时不时发生故障 xff0c 他受不了了 xff0c 想要写一个高效易用零bug的操作系统 这工程量太大了 xff0c 所以他定了一个小目标 xff0c 从实现一个目录管
  • Week11 作业 E - 选做题11-1 东东与 ATM

    一家银行计划安装一台用于提取现金的机器 机器能够按要求的现金量发送适当的账单 机器使用正好N种不同的面额钞票 xff0c 例如D k xff0c k 61 1 2 N xff0c 并且对于每种面额D k xff0c 机器都有n k张钞票 例
  • Week14 作业 D - Q老师染砖(选做)

    Description 衣食无忧的 Q老师 有一天突发奇想 xff0c 想要去感受一下劳动人民的艰苦生活 具体工作是这样的 xff0c 有 N 块砖排成一排染色 xff0c 每一块砖需要涂上红 蓝 绿 黄这 4 种颜色中的其中 1 种 且当
  • Week15 实验

    A Q 老师的记录册 Problem Statement Q 老师有 N 个学生 xff0c 每个学生都有各自独立的编号 xff0c 且编号范围在 1 N 之间 这一天 xff0c 所有学生都在不同的时间进入教室 Q 老师记录了当编号为 i
  • ffmpeg nonmatching transport in server reply

    google ONE I looked at the source for ffmpeg to see the relavent lines generating that error to try and understand what
  • 最全openstack部署教程

    简单讲讲这个鬼东西 简单点来说就是一个云 xff0c 一个属于自己的云平台 xff0c openstack的原版是亚马逊云 xff0c 可以说openstack就是Rackspace和NASA的抄袭产物 官方点说一个云平台管理的项目 xff
  • ubuntu 20.04安装cuda

    ubuntu 20 04中安装cuda 正确安装方法 xff1a 安装tensorflow后跑深度学习代码时 xff0c 发现只在cpu上运行 运行下列代码 span class token keyword import span tens

随机推荐

  • COCO数据集

    COCO数据集简介 全称 xff1a Common Objects in COntext xff08 上下文中的常见对象 xff09 创建者 xff1a 微软团队 xff1a 类别数 xff1a 引申 xff1a MS COCO数据集中的图
  • Manjaro软件配置与安装

    文章目录 软件安装安装NVIDIA显卡驱动常见工具软件软件安装开发类软件配置vscode 常见问题无法安装aur包参考文章 已经入manjaro的坑 xff0c 因为xfce4轻量 稳定 xff0c 于是选择的manjaro桌面环境为xfc
  • pycharm 使用

    pycharm txt文件不显示行号 xff1a View gt Active Editor gt Show Line Numbers
  • 【版本查看】

    查看相关的版本 windows 中如何查看 conda 版本 查看cuda cudnn版本 在环境中指定使用的默认的cuda版本 一 windows 中如何查看 conda 版本 开始菜单 gt Anaconda3 gt Anaconda
  • 【标注工具】旋转的 bbox 转普通 bbox

    目的 xff1a 实现以旋转目标检测的前提下 xff0c 将旋转标记框转为普通的标记框 相关连接 xff1a 实例分割 语义分割时旋转Bounding Box导致边框变宽 xff1a https www jianshu com p bb12
  • 【cv2读取并展示图片】

    cv2 读取并展示图片 span class token keyword import span cv2 img path span class token operator 61 span span class token string
  • 【mount 挂载硬盘】

    目的 xff1a 将硬盘挂载到服务器上 xff0c 进行数据拷贝 参考链接 xff1a http t zoukankan com vincent212212 p 13784584 html 具体执行过程 xff1a 在root 用户 xff
  • 【CV2 安装报错】

    在linux 服务器中安装cv2 安装命令 xff1a pip install i https pypi tuna tsinghua edu cn simple opencv python 61 61 3 4 9 31 环境 xff1a p
  • 【darknet】【yolov3】训练踩坑

    本文已解决问题概述 xff1a 测试准确率时 xff0c 没有results 文件夹的访问权限 xff1a Segmentation fault 执行darknet 相关命令是 xff0c 无法找到 libcudart so 10 0 文件
  • 【pip】pip 命令,向指定的python环境中安装包

    问题描述 服务器中因为代理的问题无法创建虚拟环境 xff0c 因此需要在base 环境中配置yolov5模型运行时需要的环境 使用 默认的pip 命令 xff0c 能够安装对应的包 xff0c 使用pip list 命令也能够查看到需要的包
  • 【基础代码】python 一些常用的基础代码

    目录 python 获取路径中最后一部分的文件名称遍历文件夹名称时 xff0c 以数字部分为关键字 xff0c 对文件名称进行排序 获取当前位置的绝对路径 具体实现 1 python 获取路径中最后一部分的文件名称 video name1
  • 【C++学习】

    背景介绍 开发环境 xff1a VS code xff08 mingw 安装与配置 c c 43 43 环境配置 VScode 汉化 xff09 目录 一 20221018 第一个C 43 43 代码 xff08 输出一句话 xff09 一
  • CSDN用户服务条款

    重要提示 xff1a CSDN特别提示您 xff0c 在注册及使用CSDN网站及相应客户端服务前 xff0c 请事先认真阅读本服务条款内容 xff0c 特别是关于用户义务 用户责任及CSDN有限保证及免责的条款 CSDN网站及相应客户端的各
  • 【虚拟环境】【conda】相关命令

    虚拟环境相关命令 1 创建指定 python 版本的虚拟环境 conda create span class token operator span n 虚拟环境的名称 python span class token operator 61
  • 【linux】 基础命令

    linux 一些相关命令 设置行号 一 开启 关闭 行号的显示 在命令行窗口中输入 xff1a set number 其他需要查的命令 查看内存大小查看磁盘空间大小查看端口号docker 端口映射
  • 【参数图解】

    声明 xff1a 本文为随笔性质 xff0c 无意侵犯他人权益 xff0c 如有冒犯 xff0c 请文后留言 xff0c 会尽快删除 注 忘记从哪里见到的图了 xff0c 但是感觉这张图讲的很清楚 xff0c 所以添加至自己的随笔 nvid
  • 【xml】【精灵标注助手】【标签读取与重写】

    顶部位置 具体内容 精灵标注助手的标注结果 code 将精灵标注结果改为voc格式标注结果 改写后的xml文件内容 内容4 内容5 内容6 1 精灵标注助手的标注结果 返回顶部 span class token operator lt sp
  • 【Tensorrt】【笔记】转换及笔记

    注 xff1a 要选择相应的版本 xff0c 执行对应的readme 中的内容 xff0c 否则会报错 顶部位置 具体内容 readme 翻译 git 链接 yolov5 旧代码 xff0c 成功执行记录 内容4 内容5 内容6 1 rea
  • 【os 相关函数】

    os walk xff08 xff09 span class token keyword import span os root path span class token operator 61 span span class token
  • VScode环境下使用CMake构建工程

    简介 VS code环境下使用CMake构建工程 导入VScode cmake工程C C 43 43 多文件工程构建制作静态 动态链接库文件使用外部库文件构建工程CMake常用指令填坑 本文主要介绍vscode环境下使用CMake构建工程的