성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
[정성태] 저렇게 조각 코드 말고, 실제로 재현이 되는 예제 프로젝트를 압...
[정성태] Modules 창(Ctrl+Shift+U)을 띄워서, 해당 Op...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>"Visual Studio Code + Remote Development"로 윈도우 환경에서 리눅스(CentOS 7) C/C++ 개발</h1> <p> 정말이지, "Visual Studo Code"는 명작입니다. ^^; Python, node.js, Java, C# 등의 다양한 언어 지원은 물론이고, 게다가 "Remote Development"도 가능해서 윈도우 환경임에도 전혀 불편하지 않게 리눅스 프로그램 개발을 아주 매끄럽게 할 수 있습니다. 어설픈 ssh 클라이언트 도구로 연결해 불편하게 개발을 해야 했던 시절과 비교하면 정말 천국과 다름없는 ^^ 환경입니다.<br /> <br /> 자, 그럼 이번에는 C++ 소스 코드를 윈도우에서 실행한 Visual Studio Code로 원격 리눅스에 연결해 작업을 해보겠습니다. 이를 위해 우선 C/C++ 확장을 설치합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C/C++ for Visual Studio Code (Preview) ; <a target='tab' href='https://code.visualstudio.com/docs/languages/cpp'>https://code.visualstudio.com/docs/languages/cpp</a> </pre> <br /> 그런 다음 "Remote Development"로 CentOS에 연결해,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 로컬의 Visual Studio Code로 원격 리눅스 머신에 접속해 개발하는 방법 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11942'>http://www.sysnet.pe.kr/2/0/11942</a> </pre> <br /> 관련 개발 도구를 설치해 줍니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > /* 아래의 구성 요소 없이 Visual Studio에서 빌드하면 오류 발생 error : Could not find the specified C/C++ compiler 'g++'. Please make sure that a default C/C++ compiler is installed on the Linux system '...'. You can install a compiler using your system's package manager. If overriding the default compilers, please check that the compiler is installed in the specified path. */ $ sudo yum install gcc gcc-c++ make gdb </pre> <br /> 그럼, 준비는 모두 끝입니다. 이제 C++ 소스 코드 파일 하나 만들어서,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > #include <cstdio> int main() { printf("hello from app1!\n"); return 0; } </pre> <br /> "Ctrl + Shift + B"를 눌러 빌드 작업을 수행하려고 하면 다음과 같은 선택 메뉴가 뜹니다.<br /> <br /> <img alt='gcc_centos_vscode_1.png' src='/SysWebRes/bbs/gcc_centos_vscode_1.png' /><br /> <br /> "C/C++: g++ build active file"을 수행하면 현재 에디터에서 선택한 test.cpp 파일이 빌드가 됩니다. ^^ 이제 같은 폴더에 보면 "test" 파일이 생성되어 있고 TERMINAL을 이용해 실행해 볼 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ ./test hello from app1! </pre> <br /> 당연히 Ctrl + F5 또는 F5를 누르면 디버거로 "C++ (GDB/LLDB)" 항목을 선택해 BreakPoint가 지원되는 환경을 누릴 수 있습니다. 참고로, 디버깅을 하는 경우 tasks.json 파일과 launch.json 파일이 함께 생성됩니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 디버깅 시도와 함께 생성된 tasks.json 파일을 사용하면 출력 파일명도 바꿀 수 있습니다. 예를 들어, "test"를 "test.out"으로 변경하고 싶다면 관련 "args"를 수정하면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > { // See https://go.microsoft.com/fwlink/?LinkId=733558 // for the documentation about the tasks.json format "version": "2.0.0", "tasks": [ { "type": "shell", "label": "g++ build active file", "command": "/usr/bin/g++", "args": [ "-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}<span style='color: blue; font-weight: bold'>.out</span>" ], "options": { "cwd": "/usr/bin" }, "problemMatcher": [ "$gcc" ] } ] } </pre> <br /> 또한, launch.json에 이런 변경 사항을 반영해야 디버깅 시작 시 정상적으로 .out 파일이 실행됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > { // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "g++ build and debug active file", "type": "cppdbg", "request": "launch", "program": "${fileDirname}/${fileBasenameNoExtension}<span style='color: blue; font-weight: bold'>.out</span>", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": false, "MIMode": "gdb", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ], "preLaunchTask": "g++ build active file", "miDebuggerPath": "/usr/bin/gdb" } ] } </pre> <br /> <hr style='width: 50%' /><br /> <br /> 외부 라이브러리를 추가하는 경우, 가령 다음의 소스 코드를 빌드하면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > #include <cstdio> #include <dlfcn.h> #define RTLD_DELAY 0x00001 int main() { printf("hello from app1!\n"); <span style='color: blue; font-weight: bold'>dlopen</span>("libsayhello.so", RTLD_DELAY); return 0; } </pre> <br /> dlopen 함수로 인해 오류 메시지가 발생하는데,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Executing task: /usr/bin/g++ -g /home/tusr/testapp/test.cpp -o /home/tusr/testapp/test < /tmp/ccGSwEUW.o: In function `main': /home/tusr/testapp/test.cpp:10: undefined reference to `dlopen' collect2: error: ld returned 1 exit status The terminal process terminated with exit code: 1 </pre> <br /> 역시 tasks.json의 "args" 항목에 다음과 같이 g++ 실행 시의 라이브러리 의존 추가 옵션을 넣으면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > { // See https://go.microsoft.com/fwlink/?LinkId=733558 // for the documentation about the tasks.json format "version": "2.0.0", "tasks": [ { "type": "shell", "label": "g++ build active file", "command": "/usr/bin/g++", "args": [ "-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}.out", <span style='color: blue; font-weight: bold'>"-ldl"</span> ], "options": { "cwd": "/usr/bin" }, "problemMatcher": [ "$gcc" ] } ] } </pre> <br /> <hr style='width: 50%' /><br /> <br /> 참고로, 빌드(Ctrl + Shift + B)는 반드시 해당 파일이 선택된 상태에서 해야 합니다. 만약, tasks.json 파일을 선택한 상태에서 빌드를 하면 다음과 같은 식으로 test.cpp 파일 대신 tasks.json 파일이 인자로 전달됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > > Executing task: /usr/bin/g++ -g /home/kevin/testcpp/.vscode/tasks.json -o /home/kevin/testcpp/.vscode/tasks -ldl < /usr/bin/ld:/home/kevin/testcpp/.vscode/tasks.json: file format not recognized; treating as linker script /usr/bin/ld:/home/kevin/testcpp/.vscode/tasks.json:1: syntax error collect2: error: ld returned 1 exit status The terminal process terminated with exit code: 1 </pre> <br /> 물론, tasks.json에 다음과 같이 명시적으로 파일 명을 기록해 주는 것으로 우회할 수는 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > { "tasks": [ { "type": "shell", "label": "g++ build active file", "command": "/usr/bin/g++", "args": [ "-g", <span style='color: blue; font-weight: bold'>"${workspaceFolder}/test.cpp",</span> "-o", <span style='color: blue; font-weight: bold'>"${workspaceFolder}/test.out",</span> "-ldl" ], "options": { "cwd": "/usr/bin" }, // 아래의 옵션을 추가하면 Ctrl + Shift + B를 누른 경우, 메뉴 선택 없이 곧바로 빌드가 수행됨 "group": { "kind": "build", "isDefault": true } } ], "version": "2.0.0" } </pre> <br /> 이 정도면, 대충 어떤 식인지 감이 오셨겠죠?! ^^<br /> <br /> <hr style='width: 50%' /><br /> <br /> tasks.json 등의 파일에서 사용할 수 있는 변수는 다음의 공식 문서를 참고할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Variables Reference ; <a target='tab' href='https://code.visualstudio.com/docs/editor/variables-reference'>https://code.visualstudio.com/docs/editor/variables-reference</a> </pre> <br /> 물론 복잡한 프로젝트라면 make 파일 등를 만들어 관리하거나 비주얼 스튜디오를 이용하는 것도 좋겠습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Visual Studio 2019 - 리눅스 프로젝트를 이용한 공유/실행(so/out) 프로그램 개발 환경 설정 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11844'>http://www.sysnet.pe.kr/2/0/11844</a> </pre> <br /> 반면, 저렇게 간단한 코드를 빠르게 테스트하고 싶을 때는 비주얼 스튜디오 코드가 좋은 선택이 될 것입니다. ^^<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
2303
(왼쪽의 숫자를 입력해야 합니다.)