博客
关于我
vs2019+cmake实现Linux远程开发
阅读量:442 次
发布时间:2019-03-06

本文共 4270 字,大约阅读时间需要 14 分钟。

在VS2019中使用cmake进行Linux远程开发是一个强大的解决方案,尤其对于那些习惯于Linux开发环境的开发者而言。虽然传统的sln项目在Windows环境下更为常见,但对于Linux开发者来说,使用autotools或cmake进行项目组织更加直观且符合Linux开发习惯。

autotools与cmake的对比

autotools是Linux开发中的一个古老但广泛使用的构建系统。它通过检测系统环境并生成makefile来简化项目构建过程。每个项目都需要执行类似./configure && make的命令,这背后就是autotools在驱动构建过程。然而,autotools的学习成本和维护成本较高,这促使了cmake的出现。cmake相比autotools更简单易学,同时在表现力和定制化上更为强大,支持丰富的官方模块和第三方模块。许多知名项目如Google Test、qbittorrent、KDE、MySQL等都已开始采用cmake,未来Qt项目也计划从qmake迁移至cmake。

VS2019与cmake的支持

尽管VS2019不支持autotools工具链,但它确实支持cmake,并且相比VS2017,VS2019提供了更全面的远程开发支持。因此,今天我们将探索如何在VS2019中使用cmake进行Linux远程开发。

创建远程cmake项目

在VS中创建cmake项目与传统项目类似。在“创建新项目”窗口中选择“CMkae项目”,然后点击下一步即可完成。项目创建完成后,你会发现与传统sln项目不同的地方:cmake项目的组织完全依赖于CMakeLists.txt文件,而VS负责在不同环境(如本地或远程)上调用cmake。

设置远程开发环境

在VS中设置远程开发环境之前,确保你已正确配置远程连接,并同步远程环境的头文件。创建完成的项目中,右键点击CMakeLists.txt文件,选择“项目属性”,然后点击“CMake设置”按钮,生成CMakeSettings.json文件。

在CMakeSettings.json中,你可以根据需要配置项目参数。例如,设置远程计算机名称为你连接的Linux机 IP地址或 hostname。选择合适的工具链(如gcc或clang),并配置远程生成根目录。默认情况下,VS会将生成文件存储在用户的.vs目录下。

编写CMakeLists.txt

cmake项目的核心是CMakeLists.txt文件。在我们的示例中,我们创建了一个使用Qt的简单图表应用。CMakeLists.txt文件如下:

project(LinuxQtExample)set(CMAKE_CXX_STANDARD 17)cmake_minimum_required(VERSION 3.10)set(CMAKE_INCLUDE_CURRENT_DIR ON)set(CMAKE_AUTOMOC ON)set(CMAKE_AUTOUIC ON)set(CMAKE_AUTORCC ON)find_package(Qt5Widgets REQUIRED)find_package(Qt5Core REQUIRED)find_package(Qt5Gui REQUIRED)find_package(Qt5Charts REQUIRED)add_executable(LinuxQt "main.cpp")target_link_libraries(LinuxQt Qt5::Core Qt5::Widgets Qt5::Gui Qt5::Charts)

编写测试代码

编写完成后,你可以在VS中直接编写代码。虽然Qt的代码补全可能不如CLion完美,但C++标准库的补全是完全可靠的。以下是一个简单的Qt图表应用示例:

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
static QtCharts::QBarSeries* createSeries() { auto dataSet1 = new QtCharts::QBarSet("mt19937"); std::random_device rd; std::uniform_int_distribution
u(0, 100); std::mt19937 rd1(rd()); for (int i = 0; i < 10; ++i) { auto a = u(rd1); std::cout << a << std::endl; dataSet1 << a; } auto dataSet2 = new QtCharts::QBarSet("minstd_rand"); std::minstd_rand rd2(rd()); for (int i = 0; i < 10; ++i) { auto a = u(rd2); std::cout << a << std::endl; dataSet2 << a; } auto dataSet3 = new QtCharts::QBarSet("default"); std::default_random_engine rd3(rd()); for (int i = 0; i < 10; ++i) { auto a = u(rd3); std::cout << a << std::endl; dataSet3 << a; } auto dataSet4 = new QtCharts::QBarSet("ranlux48"); std::ranlux48 rd4(rd()); for (int i = 0; i < 10; ++i) { auto a = u(rd4); std::cout << a << std::endl; dataSet4 << a; } auto dataSet5 = new QtCharts::QBarSet("knuth_b"); std::knuth_b rd5(rd()); for (int i = 0; i < 10; ++i) { auto a = u(rd5); std::cout << a << std::endl; dataSet5 << a; } auto barSeries = new QtCharts::QBarSeries(); barSeries->append(dataSet1); barSeries->append(dataSet2); barSeries->append(dataSet3); barSeries->append(dataSet4); barSeries->append(dataSet5); return barSeries;}int main(int argc, char* argv) { QApplication app(argc, argv); auto chart = new QtCharts::QChart; auto axisY = new QtCharts::QValueAxis; axisY->setRange(0, 100); axisY->setTickCount(10); axisY->setTitleText("Y轴"); chart->addAxis(axisY, Qt::AlignLeft); auto axisX = new QtCharts::QBarCategoryAxis; axisX->append(QStringList<<"1<<"<<"2<<"<<"3<<"...<<"10"); chart->addAxis(axisX, Qt::AlignBottom); auto barSeries = createSeries(); chart->addSeries(barSeries); chart->setTitle("随机数分布图"); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); auto view = new QtCharts::QChartView(chart); view->setRenderHint(QPainter::Antialiasing); auto layout = new QVBoxLayout; layout->addWidget(view); auto button = new QPushButton("点击刷新"); QObject::connect(button, &QPushButton::clicked, [chart]() { chart->removeAllSeries(); auto barSeries = createSeries(); chart->addSeries(barSeries); }); layout->addWidget(button, Qt::AlignCenter); auto window = new QWidget; window->setLayout(layout); window->setWindowTitle("图表"); window->resize(700, 500); window->show(); app.exec();}

运行测试

在VS中,点击“生成”菜单中的“生成全部”,VS会将项目复制到远程机上并执行cmake和make命令。生成完成后,程序会出现在远程生成根目录下。双击运行即可在远程环境中执行程序。

总结

cmake项目在组织和构建过程中比传统sln项目更加灵活和高效,尤其适合需要跨平台支持的项目。虽然在VS中使用cmake进行Qt GUI开发存在一些挑战(如代码补全和远程运行的问题),但对于基础的图形化应用开发来说,这是一个强大的工具。

转载地址:http://trskz.baihongyu.com/

你可能感兴趣的文章
Neo4j的安装与使用
查看>>
Neo4j(2):环境搭建
查看>>
Neo私链
查看>>
nessus快速安装使用指南(非常详细)零基础入门到精通,收藏这一篇就够了
查看>>
Nessus漏洞扫描教程之配置Nessus
查看>>
Nest.js 6.0.0 正式版发布,基于 TypeScript 的 Node.js 框架
查看>>
NetApp凭借领先的混合云数据与服务把握数字化转型机遇
查看>>
NetBeans IDE8.0需要JDK1.7及以上版本
查看>>
netcat的端口转发功能的实现
查看>>
netfilter应用场景
查看>>
netlink2.6.32内核实现源码
查看>>
Netpas:不一样的SD-WAN+ 保障网络通讯品质
查看>>
NetScaler的常用配置
查看>>
netsh advfirewall
查看>>
NETSH WINSOCK RESET这条命令的含义和作用?
查看>>
Netty WebSocket客户端
查看>>
netty 主要组件+黏包半包+rpc框架+源码透析
查看>>
Netty 异步任务调度与异步线程池
查看>>
Netty中集成Protobuf实现Java对象数据传递
查看>>
Netty事件注册机制深入解析
查看>>