cmake对应vs2019_使用CMAKE管理vs2019和pcl

时间:2023-09-18 17:14

?之前的?linux下vscode配置c++,使其和Visual Studio2019一样调试文章和本篇类似,配置vscode使其和vs2019进行调试和编译,但是之前的文章不是很实用,是通过命令行的形式进行配置的,这样的方法针对小工程还好,如果是复杂很大的工程就显得很复杂了,那么有没有更好的方法呢?答案是有,这里大家可以参考官网的文章,官网的例子很简单,我这里是比较复杂的项目,同时也会讲解的配置过程中遇到的问题。

1.ubuntu下的cmake版本问题

? ? ? ? 之所以说这个问题,等后面我们都配置好了,会发现有时候无法调试多层文件夹的源文件,报的错误是低版本不支持错误解释在这里,需要cmake版本大于3.7.2以后才会支持,因此这里需要大家确定自己的版本。

ubuntu@ubuntu-PowerEdge-R730:~$ cmake --version

cmake version 3.21.4

如果版本没有大于3.7的需要卸载cmake然后安装更高的版本,点击这里下载cmake,下载完成后,放到ubuntu下安装:

下载安装包好,直接解压即可,然后创建软连接即可

?

?重新打开一个终端查看cmake版本:cmake --version

下面就可以配置vscode了

2.VScode配置

2.1? vscode的cmake配置

? ? ? ? 这里默认了已经安装了vscode的c++相关插件和cmake工具等插件,先配置cmake配置,打开文件-->首选项-->设置-->用户-->扩展-->CMake Tools-->Cmake:Cmake Path把在linux重新安装的cmake的位置添加进来如:

同理远程也要修改:

2.2 C++环境配置

?完成上面的基本配置后,就可以配置c++环境了,可以直接按照官方的教程来:

创建一个 CMake 项目#

如果您的现有 CMake 项目CMakeLists.txt在根目录中已有文件,则可以跳至选择套件以配置现有项目。

否则,为新项目创建一个文件夹。在终端窗口中,创建一个名为 的空文件夹cmakeQuickStart,导航到其中,然后通过输入以下命令在该文件夹中打开 VS Code:

mkdir cmakeQuickStart

cd cmakeQuickStart

code .

该code .命令会在当前工作文件夹中打开 VS Code,该文件夹将成为您的“工作区”。

创建一个 CMake hello world 项目#

CMake 工具扩展可以为您创建基本 CMake 项目的文件。打开命令面板 (?Ctrl+Shift+P?) 并运行CMake:快速启动命令:

输入项目名称。这将被写入CMakeLists.txt和一些初始源文件。

接下来,选择Executable作为项目类型以创建main.cpp包含基本main()功能的基本源文件 (?)?。

注意:如果您想创建一个基本的源文件和头文件,您应该选择Library。但是对于本教程,Executable就可以了。如果系统提示您为文件夹配置 IntelliSense,请选择允许。

这将创建一个 hello world CMake 项目main.cpp,CMakeLists.txt其中包含,?(告诉 CMake 工具如何构建您的项目)和一个以build您的构建文件命名的文件夹:

选择套件#

在您可以使用 CMake 工具扩展来构建项目之前,您需要对其进行配置以了解系统上的编译器。通过扫描“套件”来做到这一点。工具包代表一个工具链,它是用于构建项目的编译器、链接器和其他工具。扫描试剂盒:

打开命令面板 (?Ctrl+Shift+P?) 并运行CMake: Select a Kit。该扩展程序将自动扫描您计算机上的工具包并创建在您的系统上找到的编译器列表。 选择要使用的编译器。例如,根据您安装的编译器,您可能会看到如下内容:

配置 Hello World?#

您必须做两件事来配置您的 CMake 项目:选择一个工具包(您刚刚完成)和选择一个变体。

您之前选择的套件显示在状态栏中。例如:

要更改套件,您可以单击状态栏中的套件,或运行CMake:再次从命令面板中选择套件命令。如果您没有看到您正在寻找的编译器,您可以cmake-tools-kits.json在您的项目中编辑该文件。要编辑文件,请打开命令面板 (?Ctrl+Shift+P?) 并运行CMake:Edit User-Local CMake Kits命令。

选择一个变体#

变体包含有关如何构建项目的说明。默认情况下,CMake的工具扩展提供四种变体,每一个对应于默认生成类型:Debug,Release,MinRelSize,和RelWithDebInfo。这些选项执行以下操作:

Debug:禁用优化并包含调试信息。?Release:包括优化但没有调试信息。?MinRelSize:优化尺寸。没有调试信息。?RelWithDebInfo:优化速度并包含调试信息。

要选择变体,请打开命令面板 (?Ctrl+Shift+P?) 运行CMake: Select Variant命令。

选择调试以在您的构建中包含调试信息。

选定的变体将出现在活动套件旁边的状态栏中。

CMake:配置#

现在您已经选择了一个套件和一个变体,打开命令面板 (?Ctrl+Shift+P?) 并运行CMake:Configure命令来配置您的项目。这将使用您选择的工具包和变体在项目的构建文件夹中生成构建文件。

构建helloword#

配置项目后,您就可以开始构建了。打开命令面板 (?Ctrl+Shift+P?) 并运行CMake: Build命令,或从状态栏中选择Build按钮。

您可以通过从命令面板中选择CMake: Set Build Target来选择要构建的目标。默认情况下,CMake 工具会构建所有目标。选定的目标将出现在“构建”按钮旁边的状态栏中。

调试helloword#

要运行和调试您的项目,请打开main.cpp并std::cout在行上放置一个断点。然后打开命令面板(Ctrl+Shift+P)并运行CMake: Debug。调试器会停在这一std::cout行:

继续并按F5继续。

2.3 多文件夹和多工程进行环境配置

?下面看看我的文件结构

?其中build是自动创建的,CMakeLists.txt也是自动创建的,src里存在大量的源文件即.cpp文件,我们需要做的就是修改根目录下的CMakeLists.txt和创建src目录下的CMakeLists.txt,其实这些操作和前面cmake系列一样的操作,这里简要说明不懂的请看我的cmake使用教程系列,先看看根目录下的CMakeLists.txt

cmake_minimum_required(VERSION 3.7.2)

project(main VERSION 0.1.0)

include(CTest)

enable_testing()

# 查找opencv的path

find_package(OpenCV REQUIRED)

# 打印opencv的相关信息

message(STATUS "OpenCV library status:")

message(STATUS " version: ${OpenCV_VERSION}")

message(STATUS " libraries: ${OpenCV_LIBS}")

message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}")

# 添加子目录,该目录为库目录,会调用子目录的cmake文件,进行构建库

add_subdirectory(src)

add_executable(main main.cpp)

# 添加链接库

target_link_libraries(main TrafficLightRecognition ${OpenCV_LIBS})

set(CPACK_PROJECT_NAME ${PROJECT_NAME})

set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})

include(CPack)

?其中有注释的是我添加的,没有注释的是自动添加的,添加的命令主要是为了构建src的库文件,然后链接即可,src的就和前面的教程一样了,这里不再赘述,至此vscode配置结束:

# 获取本目录下的所有文件的列表

aux_source_directory(. DIR_LIB_SRCS)

# 设置c++11进行编译,如果使用了c++11的预研特性,必须写这个命令,否则报错

SET( CMAKE_CXX_FLAGS "-std=c++11 -O3")

# 通过如下命令获取opencv的相关信息,这里不采用这样的方式,采用添加目录的方式,这样增加方法的多样性

find_package(OpenCV REQUIRED)

# message(STATUS "OpenCV library status:")

# message(STATUS " version: ${OpenCV_VERSION}")

# message(STATUS " libraries: ${OpenCV_LIBS}")

# message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}")

# include_directories(${OpenCV_INCLUDE_DIRS})

link_libraries(${OpenCV_LIBS})

# 安装opencv时我们是可以知道opencv安装的位置的如:/usr/local/include

# 我这里的的源文件也依赖了matlab的运行库,因此也把头文件加载进来了

include_directories(/usr/local/MATLAB/MATLAB_Runtime/v96/extern/include /usr/local/include)

# 把对应的库文件目录也添加进来,这里添加库目录的目的是生成的静态库需要

link_directories(/usr/local/lib /usr/local/MATLAB/MATLAB_Runtime/v96/extern/bin/glnxa64 /usr/local/MATLAB/MATLAB_Runtime/v96/extern/lib/glnxa64)

# 指定编译库输出的位置,这个可以设置也可以不设置

set(LIBRARY_OUTPUT_PATH lib)

# 生成动态库

add_library(TrafficLightRecognition SHARED ${DIR_LIB_SRCS})

# 生成静态库

add_library(TrafficLightRecognition_static STATIC ${DIR_LIB_SRCS})

# 想要生成动态库和静态库相同名称的的库文件,则需要一个指令set_target_properties

# 这里只是通过重新命名的方法使其名字相同的,构建时还需不能相同

set_target_properties(TrafficLightRecognition_static PROPERTIES OUTPUT_NAME "TrafficLightRecognition")

# 这里为了完整也把安装的命令写了上去,这没使用到他

# 安装共享库和头文件

# 将动态库和静态库安装到/lib

install(TARGETS TrafficLightRecognition TrafficLightRecognition_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)

# 安装头文件

install(FILES traffic_light_recognition.h DESTINATION include)

下面看看调试的过程:

ctrl+shift+p:输入cmake:debug

?

1、准备工作

? ? CMake3.22.1和OpenCV4.5.5两个软件先下载好,没有的私聊我发出

2、正式开始安装

? ? 1>启动CMake开始配置

? ? 打开刚解压的cmake文件夹中找到bin目录下的cmake-gui.exe,双击出现CMake软件并配置如下

?? ??? ?

?? ?? ??点击cmake中左下角的 Configure进行第一次配置,会弹出选择环境对话框

?? ?

再点击Finish来进行第一次编译,编译完成如下

?? ?

?? ?再进行设置,将BUILD_opencv_world打勾,将OPENCV_ENABLE_NONFREE打勾, 接着找到OPENCV_EXTRA_MODULES_PATH,将前面解压的opencv_contrib-4.3.0中的modules文件夹给设置进去,如下图所示

?? ?

?? ?

?? ?

?? ?继续点击Configure,直到不出现红色

? ??

?? ?这三个设置好后,再点击configure,直到出现全部为白,再点击Generate来生成工程,出现如下就表示OK

? ??

注意:

?? ?在cmake中不管是勾选一条项目Configure一次,还是勾选多个项目一起Configure都是可行的,只要保证cmake上半部分的选择框的不出现红色就行,出现红色时可以通过多次点击Configure选项消除。

2、使用VS2019

?? ?再用VS2019打开上面使用CMake编译出来的OpenCV工程OpenCV.sln

?? ?

?? ?再生成->批生成->选中ALL_BUILD的Debug与Release两个版本进行生成,需要等待一段时间

?? ?????????

?? ?

? ? 接着就是生成->批生成->选中INSTALL的Debug与Release两个版本进行生成,需要等待一段时间

?? ?

?? ?这一阶段就完成了,生成了如下文件夹内容

?? ?

? ? 以上是64位的编译方式,32位的编译方式就是把x64改成x86,后面的方法一一致

? ? 如有配置上的问题直接添加本人微信markmm2016找我来帮你配置

进一步使用CMAKE管理vs2019和pcl1.12.1

问题:在使用visual studio时经常使用pcl库和其他依赖库,所以每次创建一个新的项目都需要重新配置,为了加快研究进程,采用cmake来管理进行编译,自动配置导入依赖库。

当然如果采用一个项目中,通过属性设置把执行文件从生成中排出,也可正常使用,只需配置一个项目,将一个项目中的依赖库等配置好也可使用。

上述配置方式看我另一篇文章

https://www.mareenoire.info/biubiubiu011/article/details/127160201?spm=1001.2014.3001.5502

正文

**首先配置如下:cmake-3.23.3、visual studio2019、pcl1.12.1

上述软件下载地址在之前博客文章里,自行翻阅**

1.创建两个文件夹

build:存储生成文件 source存储:cpp文件和CMakeLists文件 cpp文件是即将编译的代码,文件可空,在用cmake编译完成后,打开项目,再写代码也可。

2.CMakeLists.txt

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)#规定cmake软件的最低版本。这行命令是可选的,可以不写这句话

project(VoxelGrid)#项目.sln名称

find_package(PCL REQUIRED)

include_directories(${PCL_INCLUDE_DIRS})

link_directories(${PCL_LIBRARY_DIRS})

add_definitions(${PCL_DEFINITIONS})

add_executable (pcl VoxelGrid.cpp)#执行文件名

target_link_libraries (pcl ${PCL_LIBRARIES})#文件名

具体解释:

引文:一文详解CMakeLists文件编写语法规则详解

转载:http://www.mareenoire.info/showweb/0/0/1052214944.aspx

3.编译

4.打开项目即可

还存在的问题: 暂未找到如何解决问题 的措施,但再release x64方式下,可以略过问题,进行调试。 如果有大佬找到如何解决,请告知十分感谢

------------------------分割线 已经解决:进行预处理器定义改写

_CRT_SECURE_NO_WARNINGS

BOOST_ALL_NO_LIB

BOOST_USE_WINDOWS_H

NOMINMAX

_SCL_SECURE_NO_WARNINGS

_SILENCE_FPOS_SEEKPOS_DEPRECATION_WARNING

如果还有更好的解决方案请告诉我一下哈哈哈,谢谢大佬

Copyright© 黑海资讯

鄂ICP备2023014923号