婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > vs2019+cmake實現Linux遠程開發的方法步驟

vs2019+cmake實現Linux遠程開發的方法步驟

熱門標簽:襄陽外呼增值業務線路解決方案 高德地圖標注公司位置需要錢嗎 怎么去掉地圖標注文字 廊坊地圖標注申請入口 慶陽外呼系統定制開發 合肥阿里辦理400電話號 海南人工外呼系統哪家好 北京外呼系統咨詢電話 地圖標注資源分享注冊

在上一篇文章中我們介紹了使用vs2019作為遠程Linux系統的開發環境,但我們是創建的傳統的sln項目,而對于Linux開發者來說以autotools或是cmake進行項目結構的組織更為簡單直觀,也符合在Linux環境上的習慣。

autotools是較為古老的也是使用最為廣泛的構建系統,你在Linux上總是避免不了類似./configure make這樣的命令,背后就是autotools為你完成了檢測系統環境到生成makefile的一系列工作。

cmake是較新的一種工具,autotools雖然功能強大使用廣泛,但是它的學習成本和維護成本也十分驚人,所以人們創造了cmake來簡化工作。cmake十分簡單易學,在表現力上絲毫不亞于autotools,同時還提供了豐富的官方模塊和第三方模塊以便于定制各種各樣的功能。已經有許多項目開始使用cmake了,例如google test框架,qbittorrent,KDE,_MySQL_等,未來Qt也會從qmake遷移至cmake,目前已經提供了初步支持。

遺憾的是vs2019并不支持autotools工具鏈,但是vs2019支持cmake,而且相比vs2017,vs2019提供了遠程開發的cmake支持,并且支持了更多的設置選項,所以我們今天將會介紹如何使用vs2019+cmake實現Linux遠程開發。不過需要注意的是,本文是介紹如何搭建開發環境的,并不會介紹cmake的語法,并且我也假設各位讀者已經基本了解了簡單的CMkaeLists.txt該如何編寫,如果不了解那么你可能需要先進行簡單的cmake學習,這超出了本文的討論范圍你可以尋找其他的博客園文章學習相關知識。當然,即使理解不了后文所羅列的CMakeLists.txt的內容也沒關系,我會盡量給出簡單易懂的注釋。

好了,現在該讓我們進入主題了。

創建遠程cmake項目

創建很簡單,在vs的啟動窗口中選擇“創建新項目”,然后找到“CMkae項目”,選擇后點擊下一步即可,和創建傳統項目的過程完全一樣,如圖:

創建完成后你的項目里會是如下的場景(假如項目名稱叫CMakeProject1):

也許你會奇怪,為什么cmake項目不像sln項目那樣區分出Linux和Windows平臺呢?答案是我們可以通過對項目進行設置來切換本地環境和遠程環境!

整個項目由CMakeLists.txt進行組織,而vs則負責在什么環境上運行cmake,這樣就實現了同一套項目可以幾乎不經過修改在不同平臺上編譯運行(只要你的目標平臺裝有cmake,且版本最低為3.8;本地環境vs自帶了cmake)。

默認情況下的cmake project是在本地環境的,所以接下來我們創建一個叫“LinuxQt”的遠程項目,接著設置對應的遠程Linux環境。

設置遠程環境

設置遠程環境之前,你需要先在頂部的工具菜單的選項對話框中將遠程連接設置好,并同步遠程環境的頭文件,具體過程可以參考這篇,過程一樣就不贅述了。

在初始的項目中啟動項要么是某個文件要么是空的,沒有我們的遠程環境,所以我們需要右鍵資源管理器中顯示的CMakeLists.txt文件:

找到“project-name的CMake設置”,project-name是你的項目名稱,點擊。這時會生成一個“CMakeSettings.json”的文件,這是整個項目的配置文件,雙擊打開會顯示圖形化的配置界面:

首先我們看到了配置名稱,這是給你的自定義配置起名字的地方,右邊的綠色加號表示添加新的配置,因為我們只想使用Linux遠程環境,所以我們直接修改了默認的配置項。

接下來是配置類型,這和cmake中的選項對應,在此處設置后就無需再寫進CMakeLists.txt了,有Debug,Release等模式,我們選擇Release,因為遠程環境上的Qt我沒有安裝調試符合,選Debug除了增大編譯目標的體積外也沒什么用。

下面則是重點,遠程計算機名稱選項。點擊下拉框即可出現我們在連接管理器中添加的遠程環境,如果你沒有添加遠程環境,在右側的按鈕可以直接打開連接管理器進行添加。該選項默認是空的,也就是本機編譯不啟用遠程環境。

接下來是工具集,也就是最終調用的編譯器工具鏈,vs支持gcc和clang,linux_x64對應gcc,linux_clang_x64對應clang,此外還有arm平臺的支持,選用什么工具鏈看對應平臺和個人喜好,我這里選擇了gcc。

然后是“遠程生成根”這個選項,截圖里未給出,這是遠程編譯時vs存放整個項目的路徑,默認在你的家目錄下的.vs目錄里,你也可以根據自己的需要修改這一路徑,我們演示用的項目就直接使用默認值了。

生成根選項后是設置調用cmake程序時的參數的,只要把需要的參數原樣填入輸入框即可,這里我們沒用到也就不截圖了。

vs2019中一個強大的功能就是可以把cmake中由系統或是模塊產生的變量的值顯示出來(需要在cache成功刷新之后,也就是cmakelists文件保存后或手動在項目菜單中單擊為項目生成緩存):

接著我們點擊顯示高級選項,因為想要vs能提供代碼補全還需要一點設置:

在這里你可以設置cmake生成什么類型的makefile,cmake的運行目錄和編譯完成后程序的安裝目錄,以及cmake本身所在的路徑(如果你把cmake安裝到了不太常規的地方例如/opt)。

其中重點關注IntellSense選項,這是選擇代碼補全的引擎:

可以看到所有選項都是由平臺名稱-編譯器名稱-32位/64位這種格式組成的,默認值是空,我們想要代碼補全可用就要選擇和遠程環境完全對應的那種模式。

另外右上角一直有直接編輯json文件的按鈕,如果你討厭gui的話可以選擇它。

最后我們保存修改,vs會自動刷新cache,現在我們可以進行遠程開發了。

編寫CMakeLists.txt

前面說過cmake項目的組織需要依靠CMakeLists.txt,現在我們來編寫它。

我們的測試項目會使用Qt,隨機顯示一些不同引擎產生的隨機數,然后把它們顯示在圖表中。選擇這個示例是為了更好的展示cmake項目的能力,但是遠程開發gui程序在vs上目前還有些困難:

vs運行遠程環境的程序依靠ssh,然而Linux的gui程序運行需要連接xserver(通常連接信息在環境變量中),ssh啟動的shell環境里沒有這些環境變量,你可能還需要額外設置程序啟動時的命令行參數,否則運行會發生錯誤。這是Qt自身的原因,Qt依賴自己的moc系統,和原生c++有些出入,因此代碼補全時會經常找不到類型等(clion沒有此類問題)。vs自身的問題,雖然Qt自己支持cmake,但是vs在遠程環境調用moc時不能正常工作,自定義widget會報類似找不到vtable等問題。qt vs tool無法在遠程環境工作。

雖然有以上的缺陷,但是我們編寫單個文件的項目并且不自定義widget,同時只編譯生成程序而不運行的話還是沒有問題的。

下面來看看CMakeLists.txt是如何編寫的:

project(LinuxQtExample)

# 設置c++語言標準,我使用c++17
set(CMAKE_CXX_STANDARD 17)

cmake_minimum_required (VERSION 3.10)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

# 自動調用moc, uic, rcc
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)

# 找到這些Qt組件
find_package(Qt5Widgets REQUIRED)
find_package(Qt5Core REQUIRED)
find_package(Qt5Gui REQUIRED)
find_package(Qt5Charts REQUIRED)

# 將源代碼添加到此項目的可執行文件。
add_executable (LinuxQt "main.cpp")

# 將Qt的庫鏈接至程序
target_link_libraries(LinuxQt Qt5::Core Qt5::Widgets Qt5::Gui Qt5::Charts)

更多如何用cmake構建Qt程序的內容請移步這里。

編寫測試代碼

上述設置結束后就可以著手編寫代碼了,代碼提示和補全也能工作了(雖然對于Qt的部分補全不正常,但是c++標準庫的補全是可以正常工作的):

#include QApplication>
#include QBarCategoryAxis>
#include QBarSet>
#include QBarSeries>
#include QChart>
#include QChartView>
#include QPushButton>
#include QString>
#include QStringList>
#include QValueAxis>
#include QVBoxLayout>

#include iostream>
#include random>

// 這個函數里變量名起的很爛,因為是示例我偷懶了,請你不要在實際項目中寫出這種代碼
// 創建柱狀圖數據的函數
// std::random_device的某些實現在Windows上存在bug,每次運行會返回同樣的結果序列,linux沒問題
// QtCharts的所有類型/函數都在對應的命名空間中,和其他的QtWidgets不同
static QtCharts::QBarSeries* createSeries()
{
	auto dataSet1 = new QtCharts::QBarSet("mt19937");
	auto seed = std::random_device{}();
	std::uniform_int_distributionint> u(0, 100);
	std::mt19937 rd1(seed);
	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(seed);
	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(seed);
	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(seed);
	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(seed);
	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;

	// 創建Y軸顯示數據
	auto axisY = new QtCharts::QValueAxis;
	axisY->setRange(0, 100);
	axisY->setTickCount(10);
	axisY->setTitleText("Y軸");
	chart->addAxis(axisY, Qt::AlignLeft);

	// x軸顯示10次取隨機數的結果
	QStringList x;
	for (int i = 0; i  10; ++i) {
		x  QString::number(i+1);
	}
	auto axisX = new QtCharts::QBarCategoryAxis;
	axisX->append(x);
	chart->addAxis(axisX, Qt::AlignBottom);

	auto barSeries = createSeries();
	chart->addSeries(barSeries);

	chart->setTitle("隨機數分布圖");
	// 顯示圖例以及讓圖例擺放在圖表的底部
	chart->legend()->setVisible(true);
	chart->legend()->setAlignment(Qt::AlignBottom);
	// 顯示chart的容器
	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]() {
		// removeAll會幫你刪除原來的series,所以不必擔心內存泄漏
		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();
}

代碼中使用了utf8編碼的中文字符串,你需要設置源文件的編碼為utf8以免在Linux上運行時出現亂碼。具體見這里。

運行測試

如之前所說,我們不能直接點擊運行按鈕,所以對于gui程序我們只能選擇頂部工具欄的生成->全部生成,這樣vs會自動調用cmake和make來完成程序的構建:

可以看到vs將整個項目用rsync同步到了遠程機上,接著運行了cmake和make。

生成成功后我們到之前設置的“遠程生成根”下out/build/...,省略號表示的是你的cmake項目配置的名字,編譯好的程序就在這里,下面在遠程環境中運行:

總結

cmake項目總體上比sln更簡單也更好控制,只是細節上還有欠缺。

cmake本省也簡單易學,有著強大的功能,如果你是從Linux上的開發環境遷移至Windows不妨試一試cmake。

到此這篇關于vs2019+cmake實現Linux遠程開發的方法步驟的文章就介紹到這了,更多相關vs2019 Linux遠程開發內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 使用vs2019進行Linux遠程開發的方法步驟

標簽:鎮江 哈密 商丘 鶴崗 綿陽 株洲 臺州 平頂山

巨人網絡通訊聲明:本文標題《vs2019+cmake實現Linux遠程開發的方法步驟》,本文關鍵詞  vs2019+cmake,實現,Linux,遠程,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《vs2019+cmake實現Linux遠程開發的方法步驟》相關的同類信息!
  • 本頁收集關于vs2019+cmake實現Linux遠程開發的方法步驟的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲国产日韩a在线播放性色| 成人精品高清在线| 午夜国产不卡在线观看视频| 国内精品嫩模私拍在线| 欧美成人福利视频| 韩国欧美一区二区| 久久嫩草精品久久久精品| 日韩一区精品视频| 欧美精品色一区二区三区| 亚洲香肠在线观看| 91精品免费在线| 蜜桃一区二区三区四区| 久久久亚洲午夜电影| 国产精品乡下勾搭老头1| 中文字幕不卡在线播放| 色猫猫国产区一区二在线视频| 中文字幕第一区二区| 欧美亚洲一区三区| 精品中文字幕一区二区小辣椒| 久久久久久久久久久99999| 成人精品高清在线| 日本在线观看不卡视频| 久久亚洲影视婷婷| 91国产精品成人| 国产综合色产在线精品| 亚洲欧美激情在线| 久久综合一区二区| 欧美中文字幕一区二区三区亚洲| 国产酒店精品激情| 国产欧美一区二区精品久导航| 97久久精品人人做人人爽50路| 性做久久久久久久久| 久久婷婷综合激情| 欧美在线观看18| 精彩视频一区二区三区| 亚洲欧美另类久久久精品2019| 日韩免费视频线观看| 粉嫩aⅴ一区二区三区四区五区| 亚洲人成在线播放网站岛国| 欧美一区二区三区视频免费播放| 成人av在线资源| 美腿丝袜亚洲色图| 亚洲国产精品久久久久婷婷884 | 91国在线观看| 国产中文字幕精品| 亚洲国产成人av网| 亚洲欧洲国产日本综合| 91久久精品网| 久久久九九九九| 亚洲自拍欧美精品| 国内精品久久久久影院色| 国产精品不卡一区| 久久久久久一级片| 欧美美女直播网站| 在线观看一区二区精品视频| 久久99精品一区二区三区| 性欧美大战久久久久久久久| 国产精品欧美久久久久一区二区 | 捆绑紧缚一区二区三区视频| 一区二区久久久| 亚洲欧美在线高清| 欧美极品美女视频| 7878成人国产在线观看| 91极品视觉盛宴| 日本乱人伦一区| 99久久综合国产精品| www.一区二区| 成人短视频下载| 成人精品在线视频观看| 国产激情一区二区三区四区| 久久成人免费日本黄色| 麻豆专区一区二区三区四区五区| 亚洲gay无套男同| 亚洲福利视频一区二区| 亚洲综合精品自拍| 性感美女极品91精品| 亚洲一区二区美女| 五月天婷婷综合| 日本vs亚洲vs韩国一区三区二区| 一区二区高清免费观看影视大全 | 97se亚洲国产综合自在线不卡| 日韩一区二区在线免费观看| 一本色道久久综合亚洲aⅴ蜜桃| 国产成人精品免费网站| 国产一区二区三区四区五区美女 | 在线区一区二视频| 欧美日韩国产成人在线免费| 欧美精品久久99| 欧美大片在线观看一区| 久久久国产精品麻豆| 国产精品丝袜在线| 亚洲制服丝袜av| 蜜臀av性久久久久av蜜臀妖精| 久草热8精品视频在线观看| 粉嫩欧美一区二区三区高清影视 | 北条麻妃国产九九精品视频| 97se亚洲国产综合自在线观| 欧美专区在线观看一区| 538在线一区二区精品国产| 精品蜜桃在线看| 亚洲色欲色欲www| 午夜精品久久久久久久久久久| 久久99久久99精品免视看婷婷| 国产精品 日产精品 欧美精品| 91亚洲永久精品| 国产精品嫩草久久久久| 亚洲国产中文字幕| 国产精品一区专区| 欧美日韩精品专区| 国产欧美久久久精品影院| 亚洲欧美另类图片小说| 免费不卡在线视频| 91美女在线视频| 精品一区二区影视| 欧美一区二区三区人| 中文字幕第一区二区| 丁香激情综合五月| 日韩欧美激情一区| 五月激情综合婷婷| 国产精品不卡在线| 日韩va亚洲va欧美va久久| 欧美日韩一区二区不卡| 欧洲精品一区二区三区在线观看| 91国偷自产一区二区开放时间| 奇米色一区二区| 国产欧美精品一区| 激情综合网激情| 欧美大片免费久久精品三p| 亚洲精品免费在线观看| 在线观看国产日韩| 久久99九九99精品| 久久久久久久一区| 国产成人精品在线看| 综合分类小说区另类春色亚洲小说欧美 | 日av在线不卡| 日韩一级片在线观看| 亚洲综合一区在线| av一区二区三区四区| 日韩黄色免费网站| 欧美大白屁股肥臀xxxxxx| 日本中文字幕一区二区有限公司| 91色porny在线视频| 精品日韩一区二区| 色老头久久综合| 日韩av在线播放中文字幕| 日本高清视频一区二区| 亚洲欧洲综合另类| 欧美精品日韩综合在线| 亚洲美女视频一区| 亚洲成a人在线观看| 91黄色激情网站| 夜夜精品视频一区二区| 一区二区三区中文免费| 国产精品久久久久久久久快鸭| 亚洲欧美日韩中文播放 | 国内精品在线播放| 亚洲乱码国产乱码精品精的特点| 欧洲精品在线观看| 首页综合国产亚洲丝袜| 国产剧情一区二区三区| 日韩欧美国产一区二区三区| 亚洲一卡二卡三卡四卡| 欧美午夜不卡视频| 日韩精品一级中文字幕精品视频免费观看 | 亚洲色图一区二区| 国产99精品在线观看| 日韩三级中文字幕| 国产成a人亚洲精品| 日本高清成人免费播放| 午夜精品一区二区三区电影天堂| 91精品国产综合久久婷婷香蕉| 国产最新精品精品你懂的| 1024国产精品| 欧美日韩国产a| 久久99久久久久久久久久久| 337p粉嫩大胆噜噜噜噜噜91av| 99re视频这里只有精品| 五月天久久比比资源色| 国产欧美日本一区视频| 激情综合一区二区三区| 欧美成人乱码一区二区三区| 亚洲精品写真福利| 91麻豆精品国产91久久久久久| 国产经典欧美精品| 亚洲成人1区2区| 欧美高清在线精品一区| 欧美日本一道本在线视频| 国产精品一区二区黑丝| 亚洲成人福利片| 国产精品久久久久一区二区三区 | 日韩免费在线观看| 91亚洲男人天堂| 久久福利视频一区二区| 中文字幕亚洲在| 精品国产免费一区二区三区四区| 99久久婷婷国产| 国产一区二区三区观看| 亚洲国产视频一区二区| 国产精品久久久久影院老司| 日韩欧美一区二区视频|