VS2019 C++的跨平台开发——Cmake项目(一)

最近正好用到,感觉很好用,所以分享给大家。

1.创建Cmake项目

这里的解决方案和项目的概念和VC++项目的一样,解决方案就是项目的合集,项目是对应每一个静态库,动态库和可执行文件的编译目标。

创建完成:

我建议一定要把上图红框的两个内容看一遍。CMake相关的知识我都会带过,因为内容太多了就很难写。下面内容看不懂的一定要看这两个文档。

2.文件结构讲解

首先是文件夹视图,这里就是对应硬盘文件夹的结构。

上图中的两个CMakeLists.txt就如同VC++项目中的.vcxproj文件,主要包括编译信息,链接信息和生成信息,每个项目都有一个。解决方案的文件带领它下面的所有项目进行编译。

目录结构如下:

扫描二维码关注公众号,回复: 15627052 查看本文章

解决方案文件夹

  -CMakeLists.txt

  -项目A文件夹

  -项目B文件夹

  -项目...

  -out

      -build

         -Configuration对应的编译文件夹

             -项目xxx的生成路径,cmake的cache文件

项目文件就如上图中的CMakeProject文件夹一样,下面有一个CmakeLists.txt以及项目的所有.cpp和.h文件。

上图中没有Configuration文件夹,因为还没编译,这时直接运行全部生成就可以了:

Cmake项目的生成进度以及错误一定要仔细观察输出窗口:

当然错误列表还是能够工作的,这个输出窗口就对应控制台命令行的输出。

编译好以后就可以查看配置文件夹的内容:

3.Cmake的目标视图

上面的视图就是文件夹视图,实际上VS还提供了一个更符合MS气质的视图:

这样看着是不是完全就是在看VC++项目的感觉了:

这个视图下对于项目信息比较直观,比如CMakeProject是一个可执行文件。同时可以对项目进行单独生成,调试:

4.添加项目和文件

这两个操作和VC++项目有一些区别。

首先是添加项目:

a. 从文件=>新建=>项目

b.直接在cmake视图中添加(需要比较新的VS2019版本,我公司16.5.1有,家里16.4的没有):

暂时决定添加一个静态库,命名为CMakeStatic:

然后是添加C++文件

首先原始的做法是把写好的文件放到对应项目文件夹目录下,然后在CMakeLists.txt中添加。但是这里只示范更符合VS风格的添加:

在CMake视图中选择需要添加的项目然后右键,添加,这里的操作和VC++项目一样。但是结果和VC++项目不一样,VC++项目是将所有项目相关的文件放在一个文件夹下面,即编译产生的文件也会在项目文件夹下面。而CMake项目则将源码和编译完全分割开了。

在之前的文章中,我有讲过VC++项目文件夹的结构以及如何做好代码和编译文件的分割。在这里VS已经做好了这部分,请看:

这样在上传GitHub进行源代码管理的时候就很方便了。

最后提示下,按照上面的流程操作没有在CMake项目下找到添加项目和文件的按键,最好的建议就是升级你的VS版本。

添加类以后,VS在CMakeStatic的文件夹下面的CMakeLists.txt中自动完成了add_library的操作:

如果是添加现有项,比如在第一个项目中添加第二个项目的HelloCMake类:

VS会自动完成相对路径转换。

5.配置项目依赖关系

刚刚创建了两个项目,一个静态库,一个可执行文件,现在示范下如何在可执行文件下链接使用静态库。

首先CMakeStatic生成的静态库的位置在这里:

这个是不好的。如果每个项目都生成在各自项目文件夹下面,当我的某个项目需要使用的时候,Link的路径是"../CMakeStatic/CMakeStatic.lib"(../是退出当前项目到上一级x64-Debug配置文件夹路径下)。这还是项目文件夹名和生成库名是一样的情况。如果是"CMakeA/a.lib"的情况就很麻烦了。所以我们期望这个解决方案下的lib文件都生成到一个lib文件夹下面。从我目前的项目经验来看这样也是普遍的做法,所以建议VS也能如此更新。

这一步就需要会CMake语法了。不用过于担心,我也只是熟悉几个常用的语法,其他的都是使用的时候去网上查。而且VS也提供了智能索引的功能:

下面的内容很重要:在对每个CMakeLists.txt的文件进编辑的时候,按下CTRL+S即文件保存的按键,这时候会自动触发CMake项目的配置流程。

所有的生成操作必须要等下方的从CMake收集xxxxxx这个消失以后才能开始。

如果失败了,那个取消的位置会显示"生成+"。这里我故意写了一个错误代码:

看到这个生成+就需要看错误列表或者输出:

注意上面的Test Dir的那一行,就是这句的打印信息:message("Test Dir: ${CMAKE_BINARY_DIR}")。这也是我常用的调试方法,message你想要看的CMake宏然后CTRL+S保存一下,在输出窗口的CMake中查看这个宏的值。

回到项目配置,为了将CMakeStatic项目的.lib生成到x64-Debug下面的lib文件夹中,所以我增加了这句代码:

这里直接运行下项目的生成:

对CMakeProject也做同样的操作,将exe生成到bin路径下:

下面正式开始介绍怎么链接两个项目:

首先在CMakeStatic中加入测试的函数:

//HelloCmake.h
#pragma once
class HelloCMake
{
public:
	const char* SayMyName();
};

//HelloCmake.cpp
#include "HelloCMake.h"

const char* HelloCMake::SayMyName()
{
	return "Heisenberg";
}

接着在CMakeProject中添加调用代码:

///CMakeProject.cpp
// CMakeProject.cpp: 定义应用程序的入口点。
//

#include "CMakeProject.h"
#include "../CMakeStatic/HelloCMake.h"
//同一个解决方案的头文件不建议加入到头文件路径下
//直接使用../的相对路径更好,这样放便知道头文件是哪个项目的。
//如果像外部的头文件比如opencv的可以统一加入include_directories中

using namespace std;

int main()
{
	cout << "Hello CMake." << endl;
	HelloCMake breakingbad;
	cout << breakingbad.SayMyName() << endl;
	return 0;
}

最后一步就是加入链接关系,也就是VC++项目中的链接器=》输入:

运行:

调试也和VC++项目完全一样,直接断点就行:

后话:

这是CMake系列的第一篇文章,预计还有一到两篇吧,主要的内容是部署Linux和WSL,以及介绍配置相关内容(本文中只使用了VS默认生成的x64-Debug配置)。

这篇文章一开始我是用家里的电脑写的,结果VS升级过程中出现问题,正好周日来公司加班完成剩下的部分。

猜你喜欢

转载自blog.csdn.net/luoyu510183/article/details/105151127
今日推荐