개요
리눅스 개발 환경에서 C/C++ 정적 라이브러리(.a)를 생성하고 관리할 때 필수적인 ar 명령어의 핵심 패턴을 살펴봅니다. 아카이브 생성부터 오브젝트 파일 추출, 심볼 테이블 인덱싱(ranlib)과 실무에서 자주 겪는 주의점까지 단계별로 정리합니다.
실습 환경 구성 및 오브젝트 파일(.o) 준비
ar 명령어가 포함된 binutils 패키지와 소스 코드 컴파일에 필요한 gcc 컴파일러를 설치하기 위해 apt-get update -qq && apt-get install -y binutils gcc 명령어를 실행합니다.

정적 라이브러리 생성 실습을 진행할 전용 디렉터리를 만들고 해당 경로로 이동하기 위해 mkdir -p /tmp/ar_demo && cd /tmp/ar_demo 명령어를 실행합니다.

정적 라이브러리로 묶을 덧셈 함수 소스 코드를 생성하기 위해 echo 'int add(int a, int b) { return a + b; }' > math_add.c 명령어를 실행합니다.

정적 라이브러리에 함께 포함할 뺄셈 함수 소스 코드를 생성하기 위해 echo 'int sub(int a, int b) { return a - b; }' > math_sub.c 명령어를 실행합니다.

작성한 C 소스 파일들을 아카이브 생성을 위한 오브젝트 파일(.o)로 각각 컴파일하기 위해 gcc -c math_add.c math_sub.c 명령어를 실행합니다.

컴파일 결과로 math_add.o와 math_sub.o 오브젝트 파일이 정상적으로 생성되었는지 확인하기 위해 ls -l *.o 명령어를 실행합니다.

정적 라이브러리(.a) 아카이브 생성과 파일 추가 (ar rcs)
실습을 진행할 전용 작업 디렉터리로 이동하기 위해 cd /tmp/ar_demo 명령어를 실행합니다.

컴파일된 오브젝트 파일들을 묶어 정적 라이브러리(libmath.a)를 생성하고 심볼 색인을 생성하기 위해 ar rcs libmath.a math_add.o math_sub.o 명령어를 실행합니다.r은 아카이브에 파일을 삽입하거나 교체하고, c는 아카이브가 없을 때 새로 생성하며, s는 심볼 색인 테이블을 생성 및 갱신합니다.

생성된 정적 라이브러리 파일의 상세 정보와 크기를 사람이 읽기 쉬운 단위로 확인하기 위해 ls -lh libmath.a 명령어를 실행합니다.

아카이브 내용 확인과 심볼 목록 조회 (ar t, nm)
아카이브 확인 실습을 진행할 전용 작업 디렉터리로 이동하기 위해 cd /tmp/ar_demo 명령어를 실행합니다.

생성된 정적 라이브러리(libmath.a) 내부에 포함된 오브젝트 파일 목록과 각 파일의 권한, 소유자, 크기, 수정 시각 등 상세 정보를 확인하기 위해 ar tv libmath.a 명령어를 실행합니다.t 옵션은 아카이브의 내용 목록을 표시하며, v 옵션을 함께 지정하면 파일의 상세 메타데이터를 상세히 출력합니다.

정적 라이브러리에 포함된 심볼 테이블과 각 오브젝트 파일의 함수 심볼 목록을 점검하기 위해 nm -s libmath.a 명령어를 실행합니다.nm 명령어는 오브젝트 및 라이브러리 파일의 심볼을 표시하며, -s 옵션은 아카이브 인덱스(심볼 테이블) 정보를 함께 출력하여 링커가 참조할 심볼들이 올바르게 인덱싱되었는지 확인할 수 있습니다.

특정 오브젝트 파일 추출 및 삭제 (ar x, ar d)
아카이브에서 파일을 분리하여 추출할 전용 디렉터리를 생성하기 위해 cd /tmp/ar_demo && mkdir -p extracted 명령어를 실행합니다.

추출용 디렉터리로 이동한 뒤 정적 라이브러리(libmath.a)에서 math_add.o 오브젝트 파일만 지정하여 꺼내고 정상적으로 추출되었는지 확인하기 위해 cd extracted && ar x ../libmath.a math_add.o && ls -l 명령어를 실행합니다.x 명령은 아카이브 내부에서 지정한 멤버 파일을 현재 작업 디렉터리로 추출합니다.

이후 작업을 진행하기 위해 원래 실습 디렉터리로 돌아가고자 cd /tmp/ar_demo 명령어를 실행합니다.

정적 라이브러리(libmath.a)에서 불필요해진 math_sub.o 오브젝트 파일을 완전히 제거하기 위해 ar d libmath.a math_sub.o 명령어를 실행합니다.d 명령은 아카이브 내부에서 지정한 특정 모듈을 삭제하여 라이브러리 구성을 정리합니다.

오브젝트 파일이 정상적으로 삭제되어 math_add.o만 아카이브에 남아있는지 목록을 점검하기 위해 ar t libmath.a 명령어를 실행합니다.

실무 주의점: 심볼 인덱스 누락 방지와 오브젝트 파일 순서
정적 라이브러리 수정 및 인덱스 갱신 실습을 진행하기 위해 작업 디렉터리로 이동하고자 cd /tmp/ar_demo 명령어를 실행합니다.

s 옵션을 지정하지 않고 math_sub.o 오브젝트 파일을 아카이브에 다시 추가하기 위해 ar r libmath.a math_sub.o 명령어를 실행합니다.
심볼 색인을 생성하는 s 플래그 없이 아카이브를 수정하면 내부 심볼 테이블이 동기화되지 않아 링커가 함수를 찾지 못하는 오류가 발생할 수 있습니다.

누락되거나 갱신되지 않은 정적 라이브러리의 심볼 인덱스 테이블을 생성하기 위해 ranlib libmath.a 명령어를 실행합니다.ranlib 명령어는 아카이브 헤더에 심볼 색인을 구성하여 링커가 오브젝트 파일 내의 심볼을 올바르게 참조할 수 있도록 보장합니다.

ranlib 적용 후 라이브러리의 심볼 색인 테이블이 정상적으로 생성되었는지 점검하기 위해 nm -s libmath.a 명령어를 실행합니다.
출력된 아카이브 인덱스를 통해 추가된 오브젝트 파일의 함수 심볼들이 누락 없이 올바르게 인덱싱되었는지 확인할 수 있습니다.

지금까지 리눅스 ar 명령어를 활용한 정적 라이브러리 아카이브 생성부터 실무에서 놓치기 쉬운 주의점까지 깔끔하게 정리해보았습니다.
직접 아카이브를 빌드하고 링크해보며 C/C++ 프로젝트 관리 역량을 한 단계 더 높여보시길 바랍니다.