라떼군 뉴스


C 프로그램 컴파일, 더 이상 포기하지 마세요!

이 글은 다음 링크를 참고하여 인사이트를 더한 것입니다. 원문은 해당 링크에서 확인해주세요: https://jvns.ca/blog/2025/06/10/how-to-compile-a-c-program/↗

C/C++ 프로그래머가 아니더라도 소스 코드에서 C 프로그램을 컴파일해야 하는 상황은 종종 발생합니다. 과거에는 의존성을 설치하고 make를 실행한 다음, 안 되면 포기하거나 누군가 컴파일해둔 바이너리를 찾는 것이 일반적이었지만, 이제는 직접 컴파일해야 하는 경우가 늘고 있습니다.

C 프로그램을 컴파일하기 위한 단계는 다음과 같습니다.

  1. C 컴파일러 설치: Ubuntu에서는 sudo apt-get install build-essential (gcc, g++, make 포함)을, Mac에서는 Xcode Command Line Tools를 설치해야 합니다.
  2. 프로그램 의존성 설치: C는 의존성 관리자가 없으므로, README 파일에서 필요한 라이브러리를 확인하고 직접 설치해야 합니다. 예를 들어, paperjam의 경우 libqpdf-devlibpaper-dev가 필요하며, sudo apt install -y libqpdf-dev libpaper-dev로 설치할 수 있습니다. Mac에서는 Homebrew를 통해 해당 패키지를 찾아서 설치해야 합니다.
  3. ./configure 실행 (필요한 경우): 일부 C 프로그램은 Makefile 대신 ./configure 스크립트를 제공합니다. 이를 실행하면 Makefile을 생성하거나 누락된 의존성으로 인해 실패할 수 있습니다. 이는 ‘autotools’ 시스템의 일부입니다.
  4. make 실행: make 명령어를 사용하여 프로그램을 빌드합니다. make -j8을 사용하면 빌드 속도를 높일 수 있습니다. 컴파일러 오류가 발생하는 경우, 대부분 의존성 문제일 가능성이 높습니다.
  5. 컴파일러 및 링커 이해: C 프로그램 빌드는 코드를 오브젝트 파일로 컴파일(gcc 또는 clang 사용)하고, 이 오브젝트 파일들을 최종 바이너리로 링크(ld 사용)하는 두 단계로 나뉩니다. 의존성 문제를 해결하려면 컴파일러와 링커에 올바른 플래그를 전달해야 합니다.
  6. make 환경 변수 활용: make는 환경 변수를 통해 컴파일러와 링커에 추가 파라미터를 전달할 수 있습니다. 예를 들어 LDLIBS는 링커에, CPPFLAGS는 C 컴파일러에 전달됩니다. 헤더 파일을 찾기 위한 -I 플래그, 라이브러리 파일을 찾기 위한 -L 플래그, 그리고 특정 라이브러리를 링크하기 위한 -l 플래그를 이해하는 것이 중요합니다.
    • 예시: CPPFLAGS="-I/opt/homebrew/include" LDLIBS="-L/opt/homebrew/lib -liconv" make paperjam
  7. 특정 파일만 빌드: make $FILENAME을 사용하여 특정 파일만 빌드할 수 있습니다.
  8. 다른 패키징 시스템 참조: 빌드에 어려움이 있다면, 다른 리눅스 배포판의 빌드 파일을 참고하여 힌트를 얻을 수 있습니다. 예를 들어, nix package for paperjam은 Mac에서 빌드할 때 -liconv 링커 플래그가 필요하다고 명시하고 있습니다.
  9. 바이너리 설치: 컴파일이 완료되면 make install을 사용하거나, 간단한 프로그램의 경우 cp [바이너리] ~/bin과 같이 수동으로 바이너리를 설치할 수 있습니다.

C 프로그래머가 아니더라도 C 프로그램의 작동 방식에 대한 기본적인 이해는 유용합니다. 컴파일러와 링커 플래그에 대한 완전한 지식 없이도, 기본적인 문제 해결 능력을 갖추는 것이 중요하며, 이는 시스템 전반에 대한 통찰력을 길러줍니다.