0Pricing
C Academy · 강의

정적 라이브러리와 공유 라이브러리

라이브러리를 빌드하고 링크합니다

정적 라이브러리와 공유 라이브러리은(는) CoddyKit의 무료 C Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

라이브러리란 무엇인가요

라이브러리는 매번 소스를 다시 컴파일하지 않고 여러 프로그램에서 재사용할 수 있는 컴파일된 객체 파일 묶음입니다.

C에는 두 종류가 있습니다.

  • 정적 라이브러리(.a): 링크할 때 실행 파일에 복사됩니다
  • 공유 라이브러리(.so): 실행 중에 로드됩니다

객체 파일 빌드

두 종류의 라이브러리 모두 객체 파일에서 시작합니다. 평소처럼 -c를 사용해 소스를 컴파일합니다.

이 .o 파일은 보관 도구나 링커가 패키징할 원재료입니다.

gcc -c mathlib.c -o mathlib.o
gcc -c strlib.c -o strlib.o

정적 라이브러리 만들기

ar 보관 도구는 객체 파일을 .a 보관 파일로 묶습니다. 관례적인 이름은 lib<name>.a입니다.

플래그의 의미는 다음과 같습니다. r은 삽입, c는 필요한 경우 생성, s는 색인 작성입니다.

ar rcs libmymath.a mathlib.o strlib.o

정적 라이브러리 링크

검색 디렉터리에는 -L을, 라이브러리 이름에는 -l을 사용해 링크합니다. 이때 lib 접두사와 .a 접미사는 제외합니다.

필요한 코드는 실행 파일에 복사되어 실행 파일이 독립적으로 실행됩니다.

gcc main.c -L. -lmymath -o app

정적 링크의 장단점

정적 링크는 단순하고 자체적으로 완결됩니다.

  • 실행 파일이 모든 내용을 포함하므로 실행 시 의존성이 없습니다
  • 하지만 각 프로그램이 사본을 포함하므로 바이너리가 더 커집니다
  • 라이브러리의 버그를 수정하려면 해당 라이브러리를 사용한 모든 프로그램을 다시 링크해야 합니다

위치 독립 코드

공유 라이브러리는 어떤 메모리 주소에도 로드될 수 있으므로 코드가 위치 독립적이어야 합니다. -fPIC으로 컴파일합니다.

이렇게 하면 고정 주소 대신 상대 주소 지정을 사용하는 코드가 생성됩니다.

gcc -fPIC -c mathlib.c -o mathlib.o
gcc -fPIC -c strlib.c -o strlib.o

공유 라이브러리 만들기

-shared를 사용해 .so 파일을 빌드합니다. 관례적인 이름은 lib<name>.so입니다.

정적 보관 파일과 달리, 이는 로더가 실행 중에 매핑할 수 있는 실제 링크된 객체입니다.

gcc -shared mathlib.o strlib.o -o libmymath.so

공유 라이브러리 링크

링크 방식은 정적 라이브러리의 경우와 동일해 보입니다. 차이점은 코드가 복사되지 않고 참조만 기록된다는 것입니다.

실행 파일은 작게 유지되지만 이제 실행 중에 libmymath.so를 찾아야 합니다.

gcc main.c -L. -lmymath -o app

실행 중 라이브러리 찾기

프로그램이 시작될 때 동적 로더는 표준 경로에서 .so 파일을 검색합니다. 현재 디렉터리의 라이브러리는 해당 목록에 포함되지 않습니다.

테스트할 때는 LD_LIBRARY_PATH(Linux)를 사용해 로더가 해당 라이브러리를 찾도록 지정할 수 있습니다.

LD_LIBRARY_PATH=. ./app

공유 라이브러리의 장단점

공유 라이브러리는 단순함을 유연성과 맞바꿉니다.

  • 메모리의 한 사본을 여러 프로그램이 공유하므로 RAM과 디스크 공간을 절약합니다
  • .so의 버그 수정이 다시 링크하지 않아도 모든 프로그램에 적용됩니다
  • 하지만 .so가 없거나 호환되지 않으면 프로그램이 시작되지 않습니다

마지막 위험이 흔히 말하는 '의존성 지옥'입니다.

의존성 확인

바이너리가 어떤 항목에 링크되는지 확인하는 데 도움이 되는 도구는 두 가지입니다.

  • ldd app은 로더가 실행 중에 필요로 하는 공유 라이브러리를 나열합니다
  • nm libmymath.a는 라이브러리 내부의 기호(함수)를 나열합니다

ldd에 'not found'가 표시되면 로더가 검색 경로에서 해당 .so를 찾을 수 없다는 뜻입니다.

ldd app
nm libmymath.a

빠른 확인

플래그와 목적을 연결해 보세요.

요약

이제 두 종류의 라이브러리를 모두 빌드하고 링크할 수 있습니다.

  • 정적: ar rcs libX.a *.o로 만들며, 코드가 바이너리에 복사되어 자체적으로 완결되지만 더 큽니다
  • 공유: -fPIC으로 컴파일하고 -shared로 빌드하며, 코드가 실행 중에 로드됩니다
  • 둘 다 -L과 -l로 링크하며, 공유 라이브러리에는 LD_LIBRARY_PATH와 같은 실행 시 검색 경로가 필요합니다

이제 전처리기부터 빌드까지 전체 도구 체계를 갖추었습니다.

자주 묻는 질문

“정적 라이브러리와 공유 라이브러리” 강의는 무료인가요?

네 — “정적 라이브러리와 공유 라이브러리” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C Academy 강의 전체를 잠금 해제할 수 있습니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“정적 라이브러리와 공유 라이브러리”에서 뭘 배우나요?

라이브러리를 빌드하고 링크합니다 브라우저에서 직접 실행하는 실습 코드로 C Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“정적 라이브러리와 공유 라이브러리” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 조건부 컴파일
  2. 다중 파일 프로젝트
  3. Makefile
  4. 정적 라이브러리와 공유 라이브러리
← C Academy(으)로 돌아가기