vs 2019+cmake 리 눅 스 원 격 개발 방법 절차

이전 글에서 우 리 는 vs 2019 를 원 격 리 눅 스 시스템 으로 사용 하 는 개발 환경 을 소 개 했 지만 우 리 는 전통 적 인 sln 프로젝트 를 만 들 었 고 리 눅 스 개발 자 에 게 autotools 나 cmake 로 프로젝트 구 조 를 하 는 조직 은 더욱 간단 하고 직관 적 이 며 리 눅 스 환경 에서 의 습관 에 부합된다.
autotools 는 비교적 오래 되 고 가장 광범 위 한 구축 시스템 을 사용 합 니 다.리 눅 스에 서 비슷 한 명령./configure && make을 피 할 수 없습니다.그 다음은 autotools 가 시스템 환경 을 검사 하고 Makefile 을 생 성 하 는 일련의 작업 을 완성 하 는 것 입 니 다.
cmake 는 새로운 도구 입 니 다.autotools 는 기능 이 강하 고 광범 위 하 게 사용 되 지만 학습 원가 와 유지 비용 도 놀 랍 기 때문에 사람들 은 cmake 를 만들어 업 무 를 간소화 합 니 다.cmake 는 매우 간단 하고 배우 기 쉬 우 며 표 현 력 에 있어 autotools 못 지 않 게 풍부 한 공식 모듈 과 제3자 모듈 을 제공 하여 다양한 기능 을 맞 출 수 있 습 니 다.이미 많은 항목 이 cmake 를 사용 하기 시 작 했 습 니 다.예 를 들 어 google test 프레임 워 크,qbittorrent,KDE,MySQL_등,앞으로 Qt 도 qmake 에서 cmake 로 이전 하여 현재 초보적인 지원 을 제공 합 니 다.
안 타 깝 게 도 vs 2019 는 autotools 도구 체인 을 지원 하지 않 습 니 다.그러나 vs 2019 는 cmake 를 지원 합 니 다.또한 vs 2017 에 비해 원 격 개발 cmake 지원 을 제공 하고 더 많은 설정 옵션 을 지원 합 니 다.그래서 우 리 는 오늘 vs2019+cmake 를 사용 하여 리 눅 스 원 격 으로 시작 하 는 방법 을 소개 할 것 입 니 다.그러나 주의해 야 할 것 은 본 고 는 개발 환경 을 어떻게 구축 하 는 지 소개 하 는 것 입 니 다.cmake 의 문법 을 소개 하지 않 을 것 입 니 다.그리고 저 는 독자 들 이 간단 한 CMkae Lists.txt 를 어떻게 작성 해 야 하 는 지 알 고 있다 고 가정 합 니 다.모 르 면 간단 한 cmake 학습 을 먼저 해 야 할 수도 있 습 니 다.이 는 본 논문 의 토론 범 위 를 넘 어 다른 블 로그 원 글 을 찾 아 관련 지식 을 배 울 수 있다.물론 뒷글 에 나 열 된 CMakeLists.txt 의 내용 을 이해 하지 못 하 더 라 도 가능 한 한 간단 하고 알 기 쉬 운 주석 을 드 리 겠 습 니 다.
자,이제 주제 에 들 어가 보 겠 습 니 다.
원 격 cmake 프로젝트 만 들 기
생 성 은 간단 합 니 다.vs 시작 창 에서'새 프로젝트 만 들 기'를 선택 한 다음'CMkae 프로젝트'를 찾 습 니 다.선택 한 후 다음 단 계 를 누 르 면 됩 니 다.전통 프로젝트 를 만 드 는 과정 과 똑 같 습 니 다.그림:

생 성 이 완료 되면 프로젝트 에 다음 과 같은 장면 이 있 습 니 다.(프로젝트 이름 이 CMakeProject 1 이 라면)

아마도 당신 은 이상 할 것 입 니 다.왜 cmake 프로젝트 는 sln 프로젝트 처럼 Linux 와 Windows 플랫폼 을 구분 하지 않 습 니까?정 답 은 우리 가 프로젝트 에 대한 설정 을 통 해 로 컬 환경 과 원 격 환경 을 전환 할 수 있다 는 것 이다!
전체 프로젝트 는 CMakeLists.txt 로 구성 되 고 vs 는 어떤 환경 에서 cmake 를 실행 하 는 지 책임 집 니 다.그러면 같은 프로젝트 는 수정 없 이 서로 다른 플랫폼 에서 컴 파일 하여 실행 할 수 있 습 니 다(목표 플랫폼 에 cmake 가 설치 되 어 있 고 버 전 은 최소 3.8 입 니 다.로 컬 환경 vs 자체 cmake).
기본 적 인 상황 에서 cmake procject 는 로 컬 환경 에 있 기 때문에 다음 에'LinuxQt'라 는 원 격 프로젝트 를 만 들 고 원 격 Linux 환경 을 설정 합 니 다.
원 격 환경 설정
원 격 환경 을 설정 하기 전에 맨 위 에 있 는 도구 메뉴 의 옵션 대화 상자 에서 원 격 연결 을 설정 하고 원 격 환경의 헤더 파일 을 동기 화해 야 합 니 다.구체 적 인 과정 은 참고 할 수 있 습 니 다이 편.과정 과 마찬가지 로 군말 하지 않 습 니 다.
초기 프로젝트 에서 시작 항목 은 파일 이 비어 있 거나 원 격 환경 이 없 기 때문에 자원 관리자 에 표 시 된 CMakeLists.txt 파일 을 오른쪽 단추 로 눌 러 야 합 니 다.

"procject-name 의 CMake 설정"을 찾 았 습 니 다.procject-name 은 프로젝트 이름 입 니 다.클릭 하 십시오.이 때"CMakeSettings.json"파일 이 생 성 됩 니 다.이것 은 전체 항목 의 프로필 입 니 다.두 번 누 르 면 도형 화 된 프로필 인터페이스 가 표 시 됩 니 다.

먼저 설정 이름 을 보 았 습 니 다.이것 은 사용자 정의 설정 에 이름 을 짓 는 곳 입 니 다.오른쪽 에 있 는 녹색 가 호 는 새로운 설정 을 추가 하 는 것 을 표시 합 니 다.리 눅 스 원 격 환경 만 사용 하고 싶 기 때문에 기본 설정 항목 을 직접 수정 하 였 습 니 다.
다음은 설정 형식 입 니 다.이것 은 cmake 의 옵션 과 대응 합 니 다.이 설정 을 한 후에 CMakeLists.txt 에 쓸 필요 가 없습니다.Debug,Release 등 모드 가 있 습 니 다.우 리 는 Release 를 선택 합 니 다.원 격 환경 에서 Qt 는 디 버 깅 을 설치 하지 않 았 기 때문에 Debug 를 선택 하면 컴 파일 목표 의 부 피 를 늘 리 는 것 외 에 쓸모 가 없습니다.
다음은 중점,원 격 컴퓨터 이름 옵션 입 니 다.드 롭 다운 상 자 를 누 르 면 연결 관리자 에 추 가 된 원 격 환경 이 나타 납 니 다.원 격 환경 을 추가 하지 않 으 면 오른쪽 단 추 를 누 르 면 연결 관리 자 를 직접 열 어 추가 할 수 있 습 니 다.이 옵션 은 기본적으로 비어 있 습 니 다.즉,이 컴퓨터 컴 파일 은 원 격 환경 을 사용 하지 않 습 니 다.
다음은 도구 모음 입 니 다.즉,최종 호출 된 컴 파일 러 도구 체인 입 니 다.vs gcc 와 clang 을 지원 합 니 다.linux_x64gcc 에 대응 합 니 다.linux_clang_x64clang 에 대응 합 니 다.그 밖 에 arm 플랫폼 의 지원 도 있 습 니 다.어떤 도구 체인 을 선택 하여 해당 플랫폼 과 개인 적 인 취향 을 봅 니까?저 는 gcc 를 선 택 했 습 니 다.
그 다음 에'원 격 생 성 루트'라 는 옵션 이 있 습 니 다.캡 처 에 표시 되 지 않 았 습 니 다.이것 은 원 격 컴 파일 시 vs 전체 항목 을 저장 하 는 경로 입 니 다.기본 값 은 집 디 렉 터 리.vs디 렉 터 리 에 있 습 니 다.이 경 로 를 자신의 필요 에 따라 수정 할 수 있 습 니 다.우리 가 보 여 주 는 항목 은 기본 값 을 직접 사용 할 수 있 습 니 다.
루트 옵션 을 만 든 후 cmake 프로그램 을 호출 할 때의 인 자 를 설정 합 니 다.필요 한 인 자 를 입력 상자 에 그대로 입력 하면 됩 니 다.여기 서 사용 하지 않 아 도 캡 처 하지 않 습 니 다.
vs 2019 의 강력 한 기능 은 cmake 에서 시스템 이나 모듈 에서 발생 하 는 변수의 값 을 표시 할 수 있 습 니 다.

이어서 우 리 는 고급 옵션 을 표시 하려 면 vs 코드 보완 을 위해 약간의 설정 이 필요 하기 때문에 클릭 합 니 다.

cmake 가 어떤 종류의 Makefile 을 만 드 는 지 설정 할 수 있 습 니 다.cmake 의 실행 디 렉 터 리 와 컴 파일 이 완 료 된 프로그램의 설치 디 렉 터 리,그리고 cmake 자체 가 있 는 경 로 를 설정 할 수 있 습 니 다.
그 중에서 IntellSense 옵션 에 중점 을 두 었 습 니 다.이것 은 코드 를 선택 하여 보완 하 는 엔진 입 니 다.

모든 옵션 이 - -32 /64 형식 으로 구성 되 어 있 는 것 을 볼 수 있 습 니 다.기본 값 은 비어 있 습 니 다.코드 를 보완 하려 면 원 격 환경 과 완전히 대응 하 는 모드 를 선택해 야 합 니 다.
또한 오른쪽 상단 에는 제 이 슨 파일 을 직접 편집 하 는 버튼 이 있 습 니 다.gui 가 싫 으 면 선택 하 십시오.
마지막 으로 수정 사항 을 저장 합 니 다.vs 자동 으로 cache 를 갱신 합 니 다.이제 원 격 개발 을 할 수 있 습 니 다.
CMakeLists.txt 작성
앞에서 말 했 듯 이 cmake 프로젝트 의 조직 은 CMakeLists.txt 에 의존 해 야 합 니 다.이제 작성 하 겠 습 니 다.
우리 의 테스트 항목 은 Qt 를 사용 하여 서로 다른 엔진 이 발생 하 는 무 작위 수 를 무 작위 로 표시 한 후에 그것들 을 도표 에 표시 합 니 다.이 예 시 를 선택 한 것 은 cmake 프로젝트 의 능력 을 더욱 잘 보 여주 기 위해 서 입 니 다.그러나 원 격 개발 gui 프로그램 은 vs 에서 아직 어려움 이 있 습 니 다.
vs 원 격 환경 을 실행 하 는 프로그램 은 ssh 에 의존 합 니 다.그러나 Linux 의 gui 프로그램 이 실행 되 려 면 xserver(일반적으로 연결 정 보 는 환경 변수 에 있 습 니 다)를 연결 해 야 합 니 다.ssh 가 시작 하 는 셸 환경 에는 이러한 환경 변수 가 없습니다.프로그램 이 시 작 될 때의 명령 행 인 자 를 추가 로 설정 해 야 할 수도 있 습 니 다.그렇지 않 으 면 실행 에 오류 가 발생 할 수 있 습 니 다.이것 은 Qt 자체 의 원인 입 니 다.Qt 는 자신의 moc 시스템 에 의존 하고 원생 c++와 약간의 차이 가 있 기 때문에 코드 를 보완 할 때 유형 등 을 찾 을 수 없습니다(clion 은 이러한 문제 가 없습니다).질문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_distribution<int> 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();
}
코드 에 utf 8 인 코딩 된 중국어 문자열 을 사 용 했 습 니 다.리 눅 스에 서 실 행 될 때 오류 가 발생 하지 않도록 원본 파일 의 인 코딩 을 utf 8 로 설정 해 야 합 니 다.구체 적 으로 보면여기,이곳.
실행 테스트
앞에서 말 한 바 와 같이 실행 단 추 를 직접 누 를 수 없 기 때문에 gui 프로그램 에 대해 서 는 상단 도구 모음 생 성->모든 생 성 만 선택 할 수 있 습 니 다.이렇게 vs 는 cmake 와 make 를 자동 으로 호출 하여 프로그램의 구축 을 완성 합 니 다.

vs 전체 항목 을 rsync 로 원 격 컴퓨터 에 동기 화하 고 cmake 와 make 를 실행 하 는 것 을 볼 수 있 습 니 다.
생 성 에 성공 한 후에 우 리 는 이전에 설정 한'원 격 생 성 루트'아래out/build/...에 도착 합 니 다.생략 번 호 는 cmake 프로젝트 설정 의 이름 을 표시 합 니 다.컴 파일 된 프로그램 은 바로 여기에 있 습 니 다.다음은 원 격 환경 에서 실 행 됩 니 다.

총결산
cmake 프로젝트 는 전체적으로 sln 보다 더 간단 하고 통제 가 잘 되 지만 세부 적 으로 부족 합 니 다.
cmake 본 성도 간단 하고 배우 기 쉬 우 며 강력 한 기능 을 가지 고 있 습 니 다.만약 당신 이 Linux 의 개발 환경 에서 Windows 로 이전 한다 면 cmake 를 시도 해 보 세 요.
vs2019+cmake 가 리 눅 스 원 격 개발 을 실현 하 는 방법 과 절차 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 vs 2019 리 눅 스 원 격 개발 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기