Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 2개 있습니다.)
(시리즈 글이 6개 있습니다.)
사물인터넷: 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




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]

... 16  17  18  19  20  21  22  23  24  25  26  [27]  28  29  30  ...
NoWriterDateCnt.TitleFile(s)
12953정성태2/2/20226406Linux: 48. Windows 11 + WSL 우분투 GUI 환경에서 한글 출력
12952정성태2/2/20226877.NET Framework: 1148. C# - ffmpeg(FFmpeg.AutoGen)를 이용한 오디오 필터 예제(filter_audio.c)파일 다운로드1
12951정성태2/2/20226876.NET Framework: 1147. C# - ffmpeg(FFmpeg.AutoGen)를 이용한 오디오 필터링 예제(filtering_audio.c)파일 다운로드1
12950정성태2/1/20226497.NET Framework: 1146. .NET 6에 추가되지 않은 Generic Math (예: INumber<T>)
12949정성태2/1/20226378.NET Framework: 1145. C# - ffmpeg(FFmpeg.AutoGen) - Codec 정보 열람 및 사용 준비파일 다운로드1
12948정성태1/30/20226472.NET Framework: 1144. C# - ffmpeg(FFmpeg.AutoGen) AVFormatContext를 이용해 ffprobe처럼 정보 출력파일 다운로드1
12947정성태1/30/20227615개발 환경 구성: 634. ffmpeg.exe - 기존 동영상 컨테이너에 다중 스트림을 추가하는 방법
12946정성태1/28/20226114오류 유형: 792. .NET Core - 로컬 개발 중에 docker 호스팅으로 바꾸는 경우 SQL 서버 접근 방법
12945정성태1/28/20226363오류 유형: 791. SQL 서버 로그인 시 localhost는 되고, 127.0.0.1로는 안 되는 문제
12944정성태1/28/20228754.NET Framework: 1143. C# - Entity Framework Core 6 개요
12943정성태1/27/20227678.NET Framework: 1142. .NET 5+로 포팅 시 플랫폼 호환성 경고 메시지(SYSLIB0006, SYSLIB0011, CA1416)파일 다운로드1
12942정성태1/27/20227943.NET Framework: 1141. XmlSerializer와 Dictionary 타입파일 다운로드1
12941정성태1/26/20229323오류 유형: 790. AKS/k8s - pod 상태가 Pending으로 지속되는 경우
12940정성태1/26/20226726오류 유형: 789. AKS에서 hpa에 따른 autoscale 기능이 동작하지 않는다면?
12939정성태1/25/20227434.NET Framework: 1140. C# - ffmpeg(FFmpeg.AutoGen)를 이용해 MP3 오디오 파일 인코딩/디코딩하는 예제파일 다운로드1
12938정성태1/24/20229750개발 환경 구성: 633. Docker Desktop + k8s 환경에서 local 이미지를 사용하는 방법
12937정성태1/24/20227560.NET Framework: 1139. C# - ffmpeg(FFmpeg.AutoGen)를 이용해 오디오(mp2) 인코딩하는 예제(encode_audio.c) [2]파일 다운로드1
12936정성태1/22/20227521.NET Framework: 1138. C# - ffmpeg(FFmpeg.AutoGen)를 이용해 멀티미디어 파일의 메타데이터를 보여주는 예제(metadata.c)파일 다운로드1
12935정성태1/22/20227708.NET Framework: 1137. ffmpeg의 파일 해시 예제(ffhash.c)를 C#으로 포팅파일 다운로드1
12934정성태1/22/20227265오류 유형: 788. Warning C6262 Function uses '65564' bytes of stack: exceeds /analyze:stacksize '16384'. Consider moving some data to heap. [2]
12933정성태1/21/20227818.NET Framework: 1136. C# - ffmpeg(FFmpeg.AutoGen)를 이용해 MP2 오디오 파일 디코딩 예제(decode_audio.c)파일 다운로드1
12932정성태1/20/20228268.NET Framework: 1135. C# - ffmpeg(FFmpeg.AutoGen)로 하드웨어 가속기를 이용한 비디오 디코딩 예제(hw_decode.c) [2]파일 다운로드1
12931정성태1/20/20226388개발 환경 구성: 632. ASP.NET Core 프로젝트를 AKS/k8s에 올리는 과정
12930정성태1/19/20227024개발 환경 구성: 631. AKS/k8s의 Volume에 파일 복사하는 방법
12929정성태1/19/20226808개발 환경 구성: 630. AKS/k8s의 Pod에 Volume 연결하는 방법
12928정성태1/18/20226951개발 환경 구성: 629. AKS/Kubernetes에서 호스팅 중인 pod에 shell(/bin/bash)로 진입하는 방법
... 16  17  18  19  20  21  22  23  24  25  26  [27]  28  29  30  ...