[C/C++] 개발환경 조성기...

apriljade·2022년 5월 25일
0

C언어

목록 보기
2/3
post-thumbnail

어지러운 개발환경


MSVC++

저는 Windows 사용자이고 Windows를 상당히 좋아합니다. 그래서 처음 코딩을 배울적에도 Windows에서 배웠고, MSVC++ 컴파일러로 개발을 진행했습니다. MSVC++는 Visual Studio로 C++개발환경을 설치하면 자동으로 설치되며 Microsoft에서 만든 Windows 전용 C/C++ 컴파일러입니다. Visual Studio에서 진행하는 C/C++개발은 특별한 설정을 하지 않으면 다 MSVC++로 컴파일 된다고 보시면 됩니다.

GCC는 뭐여?

GCC도 C 컴파일러인데요, MSVC랑 근본이 다릅니다. GCC는 POSIX API를 사용하고 MSVC는 Win32 API를 사용합니다. 흔히 처음 사용하는 printf()함수도 사용방법 자체는 gcc와 msvc모두 같지만 내부는 다릅니다. C언어처럼 저수준인 프로그램 언어에서도 printf()는 상대적으로 고수준입니다. 원래라면 write() 시스템 콜을 활용해서 구현해내야겠지만 그런 것을 하지 않더라도 편하게 텍스트를 출력할 수 있게 해주죠. 당장 Mac이나 Linux계열 운영체제에서 작성한 C 소스코드를 Visual Studio로 옮겨보면 컴파일이 안됩니다. 헤더파일을 찾을 수 없다고 뜰 가능성이 매우 높습니다.

왜 컴파일러 이야기를...?

저는 얼마전에 42서울의 라 피신 과정을 마쳤는데요, 해당 교육은 iMac으로 진행합니다. 하지만 저는 Windows를 좋아하고 집에 있는 PC는 모두 Windows입니다. 42서울에서 개발을 하다가도 집에서 하고 싶을 땐, WSL같은걸로 개발해야하는데... 가상화다보니까 네이티브에 비해 느리기도하고 버그도 많아서 스트레스가 이만저만이 아니었습니다. 그래서 windows의 powershell을 사용하면서, gcc컴파일러를 쓰는 환경을 조성하기로 마음먹습니다!

Windows에서 gcc 컴파일러 사용하기


Windows에서도 gcc 컴파일러를 사용할 수 없는 것은 아닙니다. Mingw라는 친구를 설치해서 사용하면 되는데요, Mingw는 간단히 말하면 GCC Toolchain입니다. POSIX를 Win API와 바인딩해주는 친구입니다. POSIX기반 시스템 콜을 호출하면 mingw가 Win API로 바꿔 호출되게 컴파일, 링크해주는 도구이죠! 우리는 Windows 환경에서 gcc 컴파일러를 사용하고 싶으니 Mingw를 설치해줍시다! 설치 과정은 인터넷에 많으니 넘어가겠습니다.

GCC 환경변수 설정

Mingw를 설치한다고 powershell에서 곧바로 gcc 컴파일이 가능한 것이 아닙니다. 환경변수를 설정해줘야하는데, Windows의 설정을 열어주고 검색창에 edit environment variables for your account를 검색해줍니다.

그럼 요런 창이 뜰텐데, 해당 창안의 위의 리스트에 있는 Path를 더블 클릭하여 열어줍니다.

해당 리스트의 맨 아래에 보시면 mingw의 bin 경로를 추가해주었습니다. 여러분들이 설치한 mingw의 bin 경로를 이곳에 적어주시면 됩니다.
그러고 나서 cmd를 켜고 gcc -v를 입력해봅니다.

요로코롬 잘 나오는지 확인해주세요! powershell에서 실행해도 잘 됩니다!

테스트


MakeFile이 Windows에서도 동작하도록 수정하기

C/C++개발에 있어서 Mac, Linux계열의 OS와 Windows간의 작업 연결성을 보장하기 위해 위의 행동을 했기에, 의도대로 동작할 수 있는지 곧바로 테스트를 해봅니다. 기존에 개발하던 프로그램은 MakeFile로 빌드를 했었는데, 기존의 MakeFile은 Windows에서 제대로 작동을 하지 않으니 고쳐봅시다.

기존에 clean과 fclean 명령은 rm -rf를 활용했으나 Windows에선 뜻하는 대로 작동하지 않아 바꿔줍니다...우선 MakeFile상에서 작동하는 OS를 알아낼 필요가 있습니다.

ifeq ($(OS), Windows_NT)
	doing something...
endif

Windows의 환경변수 OS는 Windows_NT입니다. 즉, 위 스크립트는 OS가 Windows일 경우 참이기에 블록안의 코드가 실행됩니다. 또한 Unix 시스템에서는 mkdir -p <name>을 이용하면 폴더가 없을 경우생성되게 했었는데, Windows에서는 동작하지 않아 MakeFile 상에서 폴더가 존재하는지 검사 후 존재하지 않는다면 폴더를 생성해주도록 만들어줬습니다.

ifeq (, $(wildcard $(OBJ_DIR)))
$(info ./obj does not exist. I'll make ./obj before complie.)
$(shell mkdir $(OBJ_DIR))
endif

정식으로 파일의 존재 유무를 파악하는 기능은 없기에 편법으로 만듭니다. wildcardwildcard <pattern>으로 동작하는데 pattern에 맞는 파일들의 경로를 반환합니다. 제가 작성한 스크립트에선 $(OBJ_DIR)을 패턴으로 넘겨줬으므로, 해당 변수인 폴더가 없으면 아무것도 반환하지 않습니다. 그래서 만약 wildcard $(OBJ_DIR)이 아무것도 반환하지 않는다면 아래의 스크립트가 실행되도록 한 것입니다. info나 shell도 make 내장 함수이므로 검색해보시면 자세한 내용을 알 수 있습니다!
MakeFile을 Windows에서도 호환되도록 수정했으니 바로 테스트를 진행해봅니다.

만들어둔 MakeFile 매크로 테스트

일단 특정 폴더에 제 코드를 클론하고 make를 바로 실행해봅니다.

깃허브에 있는 레포지토리에는 obj폴더가 없기에 정상적으로 obj폴더 생성후 gcc로 컴파일이 진행되는 모습입니다. 다른 것도 테스트 해봅시다.

MakeFile은 정상적으로 동작하네요! 이제 실행파일을 테스트해봅시다!

아주 잘 동작하는군요! ㅎㅎ

소감


이렇게 만들고보니 사실 Windows랑 Mac, Linux계열을 왔다리 갔다리하면서 개발할 일이 얼마나 있을까 싶긴합니다. 그렇다고 하더라도 적어도 42서울을 하는 동안에는 편안하겠지요! (불합격하면 이것도 무의미해집니다..ㅠㅠ) 라고 생각하지만 그냥 WSL쓰는게 편한듯...ㅎㅎㅎㅎ....
powershell은 완전 기피하고 없는 것처럼 살아왔는데, 막상 이것저것 하다보니까 나름 많이 발전한 것 같네요. winget으로 뭐 설치하기도 간편해진 것 같고...그래도 불편하긴 하지만요:)
지금처럼 마소 형님들이 힘내서 개발해주시면 제가 좋아하는 Windows가 게임용이라는 타이틀(?) 인식(?) (일반화하지는 않겠습니다. 여전히 Windows에서 개발을 하시는 분들도 많거니와 Windows에서만 가능한 개발도 많기 때문입니다. 그래도 개발은 Mac이라고 외치시는 사람이 많은 것은 사실이라고 생각합니다.) 을 벗어날 수 있을 것 같습니다!

추가로 제가 이글을 작성하면서 썼던 코드는 요기에 있습니다!

0개의 댓글