vs 2019+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_x64
gcc 에 대응 합 니 다.linux_clang_x64
clang 에 대응 합 니 다.그 밖 에 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 리 눅 스 원 격 개발 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
vs 2019 에서 MFC 를 사용 하여 간단 한 windows 창 프로그램 구축vs 모듈 업데이트 인터페이스 에 들 어가 면 vs 에 설 치 된 모듈 을 업데이트 할 수 있 습 니 다.mfc 개발 을 지원 하려 면 c+데스크 톱 개발 중인 mfc 모듈 을 선택 하 십시오.기본 적 인 상황 에서...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.