저는 42 과제를 할 때 IDE로 CLion을 사용하고 있습니다.
디버깅을 할 때 어떤 때는 잘 되고 어떤 때는 잘 안되기도 하고
아리송한 부분이 많아 한 번 정리해보게 되었습니다.
이 글을 쓰게 된 이유는, 다른 곳에서 작업하던 42 과제물을 CLion으로 불러올 때 빌드가 마음처럼 잘 안되었기 때문입니다.
CLion 사용 시 디버깅을 위해 빌드할 때, 기본적으로 제공되는 CMake를 어떻게 사용하는지, 혹은 작성해놓은 Makefile을 어떻게 사용하는지 적어보겠습니다.
혹시 제 글대로 하다가 무언가 기대하지 않은 결과가 나오게 되면, 프로젝트 디렉토리 내부의 .idea 라는 숨김 폴더를 삭제한 뒤 ( ex) rm -rf .idea) 다시 프로젝트를 오픈하면 해결이 될 수도 있습니다. 처음 오픈하는 프로젝트가 아닌 경우 .Idea 내부에 프로젝트 정보가 저장되어 그런 것 같아요.
1.
CLion에서 새 프로젝트를 만들 때
그냥 이렇게 새로운 프로젝트를 만들어 주면,
이렇게 기본적인 CMakeLists.txt와 함께 디버깅 환경이 마련됩니다. (상단바의 디버깅 부분에 run과 debug 아이콘에 불이 들어왔음을 확인 할 수 있습니다.)
c파일을 추가할 때 마다, target(빌드 시 컴파일 될 파일)에 add할지 체크박스가 있습니다. 체크시 CMakeLists.txt의 add_executable에 자동적으로 추가되며 빌드시 함께 컴파일 됩니다.
외부에서 파일을 데려오는 경우, 예컨대 저는 libft 과제의 일부였던 ft_atoi를 불러왔는데요, 상단바에 소속된 타겟이 없다고 에러메세지를 볼 수 있습니다.
CMakeLists.txt 파일에 add_excutable 란에 파일명을 이렇게 추가해주고(줄바꿈은 없어도 됩니다), 상단바의 reload changes 혹은 enable auto reload를 눌러주면 빌드시에 ft_atoi가 포함되게 됩니다.
2.
기존 프로젝트를 불러올 때 Makefile이 없는 경우
1써클 과제 중 get_next_line은 Makefile을 제출하지 않아도 되는데요, 이 과제를 CLion에서 열어보겠습니다.
(파일명이 붉은 건 깃 저장소가 없기 때문이니 무시하셔도 됩니다.)
이렇게 프로젝트가 열리고 아무 파일을 열어보게 되면,
상단에 select CMakeLists.txt와 create CMakeLists.txt 중 선택할 수 있게 됩니다.
select는 만들어 놓은 CMakeLists.txt를 불러오는 것인데, 그런 게 없으니 create를 선택하면 됩니다.
이렇게 빌드할 때 포함할 파일들을 선택할 수 있게 됩니다.
그런데 이렇게 만들면, mandatory 세 파일과 보너스 세 파일이 모두 한번에 빌드되기 때문에 에러가 납니다.
편의를 위해,
이런식으로 쪼개주면 상단 바에서 어떤 것을 빌드할 지 정할 수 있습니다. 제 경우는 임의의 main을 추가해 디버깅 할 수 있는 환경을 만들었습니다.
3.
기존 프로젝트를 불러올 때 Makefile이 있는 경우
이번 예시는 1써클 과제인 ft_printf입니다. 과제 요구사항에 Makefile이 있는데, 이런 프로젝트를 불러올 경우에는 CMakeList.txt가 자동적으로 생성되지 않습니다.
1) Makefile을 사용하고 싶은 경우
해당 프로젝트를 열게 되면 이런 창이 나오는데, *.o 파일들이 만들어져 있을 경우 clean을 실행할 지 묻는 창입니다. 오브젝트파일들이 만들어져 있는 상황이라면 ok를 누르시면 됩니다.
상단바에서 all을 선택해 빌드해보면,
executeable이 명시되지 않았다는 에러가 나옵니다.
ft_printf는 라이브러리를 만드는 과제이기 때문에 실행파일이 없기도 하고, 제가 명시해주기 않았기 때문이기도 한데요. 이 두가지를 해결해 보겠습니다.
이렇게 debug라는 타겟을 만들어줬습니다. libftprintf.a와 임의의 main.c를 함께 컴파일 하도록 했고, 별도의 플래그가 없어 a.out이 만들어지게 됩니다.
이후 상단의 run 버튼 옆에 타겟을 고르는 부분을 눌러 edit configuration에 들어가, debug 타겟의 excutable을 a.out으로 지정해주면 됩니다. 전 단계에서 -o 플래그로 실행파일 이름을 지정해줬다면, a.out 대신 그것을 적으면 됩니다.
다만 여기까지 하면 빌드와 run은 잘 되지만, debug가 잘 안되는데요,
이렇게 -g 플래그를 주어야만 디버깅이 원활하게 이루어집니다.
2) Makefile 대신 CMake를 사용하고 싶은 경우
프로젝트를 오픈하기 전에(한 번도 열린 적이 없어야 합니다), 빈 CMakeLists.txt를 만들거나 외부에서 아무거나 불러오고 나서 프로젝트를 오픈하면,
이렇게 CMake와 Makefile 중 무엇을 사용할 지 정할 수 있습니다.
CMake를 골라고주고 https://www.jetbrains.com/help/clion/quick-cmake-tutorial.html 를 참고하시거나 (해당 페이지에서 CMAKE_CXX라고 된 부분은 C++용이기에 이부분을 CMAKE_C로 바꿔 작성해야 정상적으로 작동합니다)
다른 프로젝트의 CMakeLists.txt를 참고해 프로젝트 이름과 add_executable 부분을 수정해 사용하시면 됩니다.
프로젝트를 연 후에 수정하고 싶다면, 프로젝트 디렉토리 내부의 .idea 라는 숨김 폴더를 삭제한 뒤 ( ex) rm -rf .idea) 다시 프로젝트를 오픈하면 됩니다.
또는 프로젝트 오픈 이전에 폴더 내부의 Makefile을 삭제해주면, CMakeLists.txt를 따로 작성하지 않더라도 2번처럼 자동으로 생성됩니다.
분명 Makefile로 로드된 프로젝트여도 CMake로 빌드하도록 전환할 수 있는 기능이 있을 것 같은데, 제가 찾지 못해 현재 이용하고 있는 방법을 공유합니다.