Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 2개 있습니다.)
(시리즈 글이 7개 있습니다.)
사물인터넷: 9. Visual Studio 2017에서 Raspberry Pi C++ 응용 프로그램 제작
; https://www.sysnet.pe.kr/2/0/11358

개발 환경 구성: 339. WSL을 이용해 윈도우 PC 1대에서 Linux 응용 프로그램을 Visual Studio로 개발하는 방법
; https://www.sysnet.pe.kr/2/0/11390

개발 환경 구성: 340. WSL을 이용해 윈도우 PC 1대에서 openSUSE 응용 프로그램을 Visual Studio로 개발하는 방법
; https://www.sysnet.pe.kr/2/0/11391

개발 환경 구성: 428. Visual Studio 2019 - CMake를 이용한 리눅스 빌드 환경 설정
; https://www.sysnet.pe.kr/2/0/11825

개발 환경 구성: 431. Visual Studio 2019 - CMake를 이용한 공유/실행(so/out) 리눅스 프로젝트 설정
; https://www.sysnet.pe.kr/2/0/11833

개발 환경 구성: 434. Visual Studio 2019 - 리눅스 프로젝트를 이용한 공유/실행(so/out) 프로그램 개발 환경 설정
; https://www.sysnet.pe.kr/2/0/11844

개발 환경 구성: 727. Visual C++ - 리눅스 프로젝트를 위한 빌드 서버의 msbuild 구성
; https://www.sysnet.pe.kr/2/0/13737




Visual Studio 2019 - CMake를 이용한 리눅스 빌드 환경 설정

저도 이제 리눅스를 피해 갈 수가 없군요. ^^ 그래서, 간단한 예제 프로젝트를 CMake로 구성해 봤습니다.

우선, 아래의 글로 SSH 연결까지 완료하고,

WSL을 이용해 윈도우 PC 1대에서 Linux 응용 프로그램을 Visual Studio로 개발하는 방법
; https://www.sysnet.pe.kr/2/0/11390

남은 작업은 아래의 글에 따라 진행하면 됩니다.

Visual C++ for Linux Development with CMake
; https://devblogs.microsoft.com/cppblog/visual-c-for-linux-development-with-cmake/

위의 글을 대충 정리해 보면,

1. 폴더를 만든 후 (예: cmtest)

2. 폴더에 다음의 내용을 담은 CMakeList.txt 파일을 생성합니다. (CMakeList.txt는 비주얼 스튜디오의 경우 .csproj 파일이라고 보면 됩니다.)

project (hello)
add_executable(hello hello.cpp)

의미는, project 이름이 "hello"이고 hello.cpp를 빌드해 "hello"라는 이름의 실행 파일이 생성된다는 것입니다.

큰 의미가 없지만 hello.cpp는 예제로 다음과 같이 간단하게 만들고,

#include <iostream>
#include <unistd.h>

int main(int argc, char* argv[])
{
	std::cout << "Hello" << std::endl;
}

3. Visual Studio에서 "File" / "Open" / "Folder..." 메뉴를 이용해 CMakeList.txt 파일이 있는 폴더(이 글에서는 "c:\cmtest")를 엽니다. 그럼 기본적으로 Configuration 설정이 "x64-Debug (default)"로 나오고 "Select Startup Item..."에는 "Current Document"와 "hello" 항목이 보입니다.

Startup Item을 "hello"로 설정하고 빌드 버튼을 누르면 unistd.h 파일이 윈도우에서는 제공되지 않으므로 빌드 오류가 발생합니다. (당연히 인텔리센스 기능도 제공받지 못합니다.) 물론, 해당 include 라인을 주석 처리하고 빌드하면 기본적으로 Windows x64 대상의 바이너리가 생성됩니다.




하지만, 우리가 원하는 것은 리눅스 머신에 연결해 ELF 바이너리를 생성하는 것입니다. 따라서 "Configuration" 목록을 열어 "x64-Debug (default)" 대신 "Manage Configurations..."를 선택해 리눅스 용 CMake 설정을 추가합니다. 그럼 프로젝트 폴더에 "CMakeSettings.json" 파일이 생성되고 비주얼 스튜디오는 그 파일을 편집할 수 있는 "CMake Settings" 화면을 띄웁니다.

linux_basic_build_env_1.png

위의 상태에서 "Remote Machine Name" 항목에 우측의 "Connection" 버튼을 눌러 빌드를 위한 원격 리눅스 머신의 SSH 연결을 설정합니다. 그럼 이와 함께 비주얼 스튜디오는 자동으로 대상 리눅스 머신의 환경을 열람해 C/C++ 헤더 파일을 로컬에 다음의 하위 폴더로 캐시합니다.

%LOCALAPPDATA%\Microsoft\Linux\HeaderCache

이제 "$(defaultRemoteMachineName)" 항목을 새롭게 생성된 연결 정보로 바꾼 후 "CMakeSettings.json" 파일을 명시적으로 저장해 줍니다. 그럼, 비주얼 스튜디오는 대상 머신에 연결해 적절한 버전의 "CMake"가 설치되어 있는지 확인합니다. 만약 없다면 비주얼 스튜디오 툴바 하단에 다음과 같은 메시지로 자동 설치를 유도합니다.

Supported CMake version is not present on '...[linux_machine_addr]...'. Instal CMake binaries build by Micrsofot? Yes No

이때 "Yes" 버튼을 누르면 비주얼 스튜디오는 대상 리눅스 측에 연결한 계정의 프로파일 폴더 하위로 cmake를 설치합니다.

~/.vs/cmake/bin

현재 버전을 보면 3.13이 설치됩니다.

~/.vs/cmake/bin$ ./cmake --version
cmake version 3.13.18112701-MSVC_2

CMake suite maintained and supported by Kitware (kitware.com/cmake).

개발 환경 설정은 이걸로 끝입니다. 이제 Configuration 설정은 "Linux-Debug"로 되고 "Build" / "Build All" 메뉴를 선택하면 소스 코드 파일이 다음의 경로에 배포되고,

/var/tmp/src/0b05273f-166e-a43b-8180-0c36846c9dce/Linux-Debug/

${workspaceHash} == 0b05273f-166e-a43b-8180-0c36846c9dce

바이너리 파일도 유사한 경로에 놓입니다.

/var/tmp/build/0b05273f-166e-a43b-8180-0c36846c9dce/build/Linux-Debug/

${workspaceHash} == 0b05273f-166e-a43b-8180-0c36846c9dce




참고로, WSL(Windows Subsystem for Linux)의 경우 설정이 매끄럽게 안 됩니다. 가령 인텔리센스를 위한 헤더 파일 다운로드가 안 되는 등의 문제(어떤 경우에는 잘 되고. ^^;)가 있는데 차라리 처음부터 간단한 예제 만들 거 아니면 리눅스 전용 빌드 머신을 구성하는 것을 권장합니다. 이 부분은 점차로 나아지겠지만 아직은 아닌 것 같습니다.

부가적으로, 빌드 결과물이 "/var/tmp/build/0b05273f-166e-a43b-8180-0c36846c9dce/build/Linux-Debug/"처럼 복잡하니까 좀 더 간단한 경로로 복사하고 싶을 텐데요. 그래서 install 명령어를 다음과 같이 추가할 수 있습니다.

cmake_minimum_required(VERSION 3.9)

project (hello)

set (BINDIR "~/bin")
add_executable(hello hello.cpp)

install(TARGETS ${PROJECT_NAME} DESTINATION ${BINDIR})

그런 다음 비주얼 스튜디오의 "Build" / "Install ${PROJECT_NAME}" 메뉴를 실행하면 "/var/tmp/build/0b05273f-166e-a43b-8180-0c36846c9dce/build/Linux-Debug/" 경로에 있는 ${PROJECT_NAME}에 해당하는 파일을 ${BINDIR}에 복사하게 됩니다.




CMake를 비주얼 스튜디오가 아닌 소스 코드 파일이 복사된 머신에서 하고 싶다면 다음과 같은 식으로 하면 된다고. ^^

# ${workspaceHash} == 0b05273f-166e-a43b-8180-0c36846c9dce

cd /var/tmp/src/0b05273f-166e-a43b-8180-0c36846c9dce/Linux-Debug/
cmake .
make install

또한, install 명령어에서 빌드 디렉터리(/var/tmp/build/0b05273f-166e-a43b-8180-0c36846c9dce/build/Linux-Debug/) 기준이 아닌, 소스 코드가 복사된 디렉터리(/var/tmp/src/0b05273f-166e-a43b-8180-0c36846c9dce/Linux-Debug/)를 기준으로 하고 싶다면 TARGETS 대신 FILES나 PROGRAMS를 사용하면 됩니다.

cmake_minimum_required(VERSION 3.9)

project (hello)

set (BINDIR "~/bin")
add_executable(hello hello.cpp)

install(TARGETS ${PROJECT_NAME} DESTINATION ${BINDIR})

install(FILES ${PROJECT_NAME}.cpp DESTINATION ${BINDIR})

FILES와 PROGRAMS는 사용법은 같은데, PROGRAMS의 경우에만 복사된 파일에 대해 실행 권한 등의 속성을 부여한다고 합니다. ^^ (리눅스 초보라 회사 동료에게 여러 가지 물어보게 되는군요. ^^)




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 2/25/2019]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2019-09-17 08시10분
[참조합니다.] 저도 어디서 퍼온건데 WSL에서는 이렇게 하니까 해더파일을 긁어와서 intellisense가 되더라구요.
1. Rename the HeaderCache?settings.xml.unused?file to?settings.xml
2. Change the syncMethod to?sftp_ssh
3. Update?from Tools->Options->Cross Platform->Connection Manager->Remote Headers Intellisense Manager

[guest]

... 166  167  168  169  170  171  172  173  [174]  175  176  177  178  179  180  ...
NoWriterDateCnt.TitleFile(s)
653정성태1/29/200921994.NET Framework: 122. XML Serializer를 이용한 값 복사: 성능은 어떨까!파일 다운로드1
652정성태1/22/200922786.NET Framework: 121. WPF - PrintTicket provider failed to bind to printer.
651정성태1/20/200920079.NET Framework: 120. 타입이 다른 배열끼리의 변환
650정성태1/19/200931868COM 개체 관련: 21. C/C++ 프로젝트에 /clr 옵션 적용으로 인한 COM 개체 사용 오류
649정성태1/18/200929412Windows: 38. Q1U UMPC에 Windows 7 베타 설치하기
648정성태1/18/200928106Windows: 37. Windows PE를 USB 메모리에 적용
647정성태1/18/200938252Windows: 36. Windows PE ISO 이미지 만들기 [1]
646정성태1/18/200931226디버깅 기술: 23. COMPLUS_ZapDisable - JIT 최적화 코드 생성 제어 [1]
645정성태1/11/200930019Windows: 35. 서명되지 않은 드라이버 로딩 방법
644정성태1/11/200921095Windows: 34. VPC 설치 후기 [2]
643정성태1/10/200926511Windows: 33. Windows 7 베타와 VMA 충돌 [1]
642정성태1/8/200925251개발 환경 구성: 34. Sysinternals의 모든 툴을 한번에 업데이트 하는 방법 [1]
641정성태1/7/200922386기타: 27. D820 - A09 바이오스 업데이트 프로그램 패치 [2]
640정성태1/4/200924066Team Foundation Server: 29. ClickOnce 응용 프로그램 배포를 Team Build에 추가.
639정성태1/4/200922051Team Foundation Server: 28. PFX 코드 서명을 포함한 프로젝트의 팀 빌드 실패 - MSB4018
638정성태1/3/200925091.NET Framework: 119. WPF - 의존 속성 정의에서 XamlParseException 발생하는 예 [2]
637정성태1/1/200927308기타: 26. 2008년 인기 순위 정리
636정성태12/31/200822419.NET Framework: 118. 2진 검색을 이용한 리스트 정렬 삽입파일 다운로드1
635정성태12/29/200825050오류 유형: 66. 파일 암호화 오류 - Recovery policy configured for this system contains invalid recovery certificate
634정성태12/29/200839390기타: 25. 가상 키보드 관련 정리 [4]
633정성태12/20/200824860기타: 24. RMClock for x64 [2]
632정성태12/19/200833484기타: 23. D820 - 배터리 없이 바이오스 업데이트 방법 [2]파일 다운로드1
631정성태12/10/200842149VC++: 36. Detours 라이브러리를 이용한 Win32 API - Sleep 호출 가로채기 [3]
630정성태12/9/200822976.NET Framework: 117. WPF - TreeView에서 항목이 펼쳐질 때 Cursors.Wait 사용파일 다운로드1
629정성태12/7/200832129.NET Framework: 116. 소켓 연결 시간 제한
628정성태12/6/200821056.NET Framework: 115. Marshal 타입 관련 2가지 자원 해제 메서드파일 다운로드1
... 166  167  168  169  170  171  172  173  [174]  175  176  177  178  179  180  ...