저는 42 과제를 할 때 IDE로 CLion을 사용하고 있습니다.

디버깅을 할 때 어떤 때는 잘 되고 어떤 때는 잘 안되기도 하고

아리송한 부분이 많아 한 번 정리해보게 되었습니다.

이 글을 쓰게 된 이유는, 다른 곳에서 작업하던 42 과제물을 CLion으로 불러올 때 빌드가 마음처럼 잘 안되었기 때문입니다.

CLion 사용 시 디버깅을 위해 빌드할 때, 기본적으로 제공되는 CMake를 어떻게 사용하는지, 혹은 작성해놓은 Makefile을 어떻게 사용하는지 적어보겠습니다.

혹시 제 글대로 하다가 무언가 기대하지 않은 결과가 나오게 되면, 프로젝트 디렉토리 내부의 .idea 라는 숨김 폴더를 삭제한 뒤 ( ex) rm -rf .idea) 다시 프로젝트를 오픈하면 해결이 될 수도 있습니다. 처음 오픈하는 프로젝트가 아닌 경우 .Idea 내부에 프로젝트 정보가 저장되어 그런 것 같아요.

  1. CLion에서 새 프로젝트를 만들 때

    스크린샷 2022-01-09 오후 1.08.28.png

    그냥 이렇게 새로운 프로젝트를 만들어 주면,

    스크린샷 2022-01-09 오후 1.09.10.png

    이렇게 기본적인 CMakeLists.txt와 함께 디버깅 환경이 마련됩니다. (상단바의 디버깅 부분에 run과 debug 아이콘에 불이 들어왔음을 확인 할 수 있습니다.)

    스크린샷 2022-01-09 오후 1.10.36.png

    c파일을 추가할 때 마다, target(빌드 시 컴파일 될 파일)에 add할지 체크박스가 있습니다. 체크시 CMakeLists.txt의 add_executable에 자동적으로 추가되며 빌드시 함께 컴파일 됩니다.

    스크린샷 2022-01-09 오후 1.12.17.png

    외부에서 파일을 데려오는 경우, 예컨대 저는 libft 과제의 일부였던 ft_atoi를 불러왔는데요, 상단바에 소속된 타겟이 없다고 에러메세지를 볼 수 있습니다.

    스크린샷 2022-01-09 오후 1.13.19.png

    CMakeLists.txt 파일에 add_excutable 란에 파일명을 이렇게 추가해주고(줄바꿈은 없어도 됩니다), 상단바의 reload changes 혹은 enable auto reload를 눌러주면 빌드시에 ft_atoi가 포함되게 됩니다.

  2. 기존 프로젝트를 불러올 때 Makefile이 없는 경우

    스크린샷 2022-01-09 오후 1.15.23.png

    1써클 과제 중 get_next_line은 Makefile을 제출하지 않아도 되는데요, 이 과제를 CLion에서 열어보겠습니다.

    스크린샷 2022-01-09 오후 1.16.50.png

    (파일명이 붉은 건 깃 저장소가 없기 때문이니 무시하셔도 됩니다.)

    이렇게 프로젝트가 열리고 아무 파일을 열어보게 되면,

    스크린샷 2022-01-09 오후 1.17.14.png

    상단에 select CMakeLists.txt와 create CMakeLists.txt 중 선택할 수 있게 됩니다.

    select는 만들어 놓은 CMakeLists.txt를 불러오는 것인데, 그런 게 없으니 create를 선택하면 됩니다.

    스크린샷 2022-01-09 오후 1.17.23.png

    이렇게 빌드할 때 포함할 파일들을 선택할 수 있게 됩니다.

    스크린샷 2022-01-09 오후 1.17.42.png

    그런데 이렇게 만들면, mandatory 세 파일과 보너스 세 파일이 모두 한번에 빌드되기 때문에 에러가 납니다.

    편의를 위해,

    스크린샷 2022-01-09 오후 1.21.05.png

    이런식으로 쪼개주면 상단 바에서 어떤 것을 빌드할 지 정할 수 있습니다. 제 경우는 임의의 main을 추가해 디버깅 할 수 있는 환경을 만들었습니다.

  3. 기존 프로젝트를 불러올 때 Makefile이 있는 경우

    스크린샷 2022-01-09 오후 1.24.20.png

    이번 예시는 1써클 과제인 ft_printf입니다. 과제 요구사항에 Makefile이 있는데, 이런 프로젝트를 불러올 경우에는 CMakeList.txt가 자동적으로 생성되지 않습니다.

    1. Makefile을 사용하고 싶은 경우

    스크린샷 2022-01-09 오후 1.24.06.png

    해당 프로젝트를 열게 되면 이런 창이 나오는데, *.o 파일들이 만들어져 있을 경우 clean을 실행할 지 묻는 창입니다. 오브젝트파일들이 만들어져 있는 상황이라면 ok를 누르시면 됩니다.

    스크린샷 2022-01-09 오후 1.25.02.png

    상단바에서 all을 선택해 빌드해보면,

    스크린샷 2022-01-09 오후 1.25.13.png

    executeable이 명시되지 않았다는 에러가 나옵니다.

    ft_printf는 라이브러리를 만드는 과제이기 때문에 실행파일이 없기도 하고, 제가 명시해주기 않았기 때문이기도 한데요. 이 두가지를 해결해 보겠습니다.

    스크린샷 2022-01-09 오후 1.28.53.png

    이렇게 debug라는 타겟을 만들어줬습니다. libftprintf.a와 임의의 main.c를 함께 컴파일 하도록 했고, 별도의 플래그가 없어 a.out이 만들어지게 됩니다.

    스크린샷 2022-01-09 오후 1.28.30.png

    이후 상단의 run 버튼 옆에 타겟을 고르는 부분을 눌러 edit configuration에 들어가, debug 타겟의 excutable을 a.out으로 지정해주면 됩니다. 전 단계에서 -o 플래그로 실행파일 이름을 지정해줬다면, a.out 대신 그것을 적으면 됩니다.

    다만 여기까지 하면 빌드와 run은 잘 되지만, debug가 잘 안되는데요,

    스크린샷 2022-01-09 오후 1.29.30.png

    이렇게 -g 플래그를 주어야만 디버깅이 원활하게 이루어집니다.

    1. Makefile 대신 CMake를 사용하고 싶은 경우

    스크린샷 2022-01-09 오후 1.30.31.png

    프로젝트를 오픈하기 전에(한 번도 열린 적이 없어야 합니다), 빈 CMakeLists.txt를 만들거나 외부에서 아무거나 불러오고 나서 프로젝트를 오픈하면,

    스크린샷 2022-01-09 오후 1.31.17.png

    이렇게 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로 빌드하도록 전환할 수 있는 기능이 있을 것 같은데, 제가 찾지 못해 현재 이용하고 있는 방법을 공유합니다.