2009-03-01 5 views
16

여러분, 유닉스에서 C++ 빌드 블록에 대해 몇 가지 설명을 해줄 것입니다.유닉스에서 Makefile에서 UNIX의 정적/동적 라이브러리로 프로젝트 만들기

정적 라이브러리와 동적 라이브러리 (.so)를 연결하는 응용 프로그램을 만들고 싶습니다.

질문 1 :gcc/g ++를 사용하여 정적 라이브러리를 만드는 방법은 무엇입니까?

질문 2 :어떻게 두 라이브러리 파일

요약 헤더했다고 가정하면, 정적 및 동적 libs와에 연결, 메이크 그것을 지정 : 나는 년 동안 메이크 파일 및 라이브러리를 사용하고, 다른 사람이 썼다. 따라서 수정할 때마다 실제로 이해하지 않고 주변을 잘라내어 붙여 넣기 만하면됩니다. 이제 나는 땅에 내려 가서 건물/연결/Makfile 프로세스를 심층적으로 이해하기를 원합니다.

친밀한 세부 사항에서 이러한 개념을 설명하는 좋은 책은 무엇입니까?

감사

답변

15

정적 라이브러리는 ar 명령으로을 보관 일반적이다. 당신은 오브젝트 파일을 모두 구축되면 (바람직하게는 GCC에 -fPIC 스위치), 당신과 같이 ar을 실행할 수 있습니다

ar -rs archivename.a list.o of.o objects.o 

man 페이지에는 옵션에 대해 설명합니다.

동적 라이브러리는 보통 -shared 스위치가 gcc 또는 ld이고 출력 파일 이름이 .so 인 경우 빌드됩니다.

Autotools는 libtool 프로그램으로이를 처리합니다. 나는 그 사용에 익숙하지 않다. 이 라이브러리에 연결

-l (ELL) 스위치를 사용하여 라이브러리를 등록하거나 (예 : 명령에 /usr/lib/libX.so을 추가로) 절대 경로를 직접 지정하여 (예 : -lXlibX.so 링크) 중 하나를 수행 할 수 있습니다. 정적 라이브러리는 -l 앞에 -static을 지정하거나 .a 아카이브에 적절한 절대 경로를 지정하여 연결됩니다. 정적 링크가 library.a하는 것을 앱 baz.cpp에 대한

PROJECT = library.a 
OBJECTS = foo.o bar.o 
CFLAGS = -Wall -pedantic 

all: $(PROJECT) 

.cpp.o: 
     g++ -c $(CFLAGS) $< 

$(PROJECT): $(OBJECTS) 
     libtool -o $(PROJECT) -static $(OBJECTS) 

베어 뼈 메이크 : : bar.cpp foo.cpp에의 코드로 구성된 정적 라이브러리를 생성하기위한

10

베어 뼈 메이크

PROJECT = baz 
CFLAGS = -Wall -pedantic 
OBJECTS = baz.o 

all: $(PROJECT) 

.cpp.o: 
     g++ -c $(CFLAGS) $< 

$(PROJECT): $(OBJECTS) library.a 
     g++ $(OBJECTS) -L. -llibrary -o $(PROJECT) 

다이내믹 라이브러리가 독자에게 연습 문제로 남아 있습니다.

+0

-c 플래그는 GCC에서 무엇입니까. 헤더 파일은 어떻습니까? –

+0

도 $ <모든 cpp 파일을 의미합니까? 왜이 사건이 필요할까요? .cpp.o : g ++ -c $ (CFLAGS) $ <어디서나 호출되는 것을 보지 못합니까? 감사합니다 –

+0

-c는 컴파일하는 것을 의미하지만 링크하지 않습니다. $ <는 확장이없는 파일 이름입니다. man 페이지에서 gcc, make를 확인하십시오. 헤더 파일은 종속성이없는 한 Makefile에 위치 할 수 없습니다. –

2

답변 1 : foo.c 및 bar 소스 파일에서 정적 라이브러리를 만들려면.C, 이렇게 :

gcc -c foo.c 
gcc -c bar.c 
ar rc mylibrary.a foo.o bar.o 

이 문제에 대한 자세한 내용은 컴파일러, 컴파일러를 통해 링커를 사용하는 방법을 배울 수있는 GCC manual 설명서를 읽어. binutils manual도 이어야합니다.

답변 2 : GNU Make manual은 꽤 입니다. 라이브러리 및 라이브러리 작동 방법을 실제로 배우려면 링커 및 로더 John R. Levine 저서를 읽어보십시오.

정적 라이브러리는 매우 간단하지만 플랫폼에 따라 에 따라 공유 라이브러리가 매우 털이있을 수 있으며 원하는 이동성이 필요합니다. 예를 들어 에서 일부 시스템 정적 및 공유 라이브러리는 올바르게 작동하려면 다른 옵션 인 으로 컴파일해야합니다. 하나는 필수이고 다른 하나는 위치 독립적 인 코드로 컴파일되지 않아야합니다. 코드). 유틸리티의 전체 프레임 워크는 이것을 편하게하기 위해 개발되었지만 (libtool), 그들 자체는 문제가되지 않습니다.

0

gcc를 참조했기 때문에 GNU Make를 사용하고 있다고 가정합니다. 내가 찾은 최고의 문서는 이해하기 쉬운 용어로 알아야 할 모든 것을 다루는 official manual입니다.

0

리눅스 프로그래밍에 대해 배울 때, Advanced Linux Programming이 많은 도움이되었습니다. this pdf에서 라이브러리 작성 및 사용 섹션을 확인할 수 있습니다. Linux의 라이브러리에 대해서는 상당히 설명되어 있습니다.

+1

아주 좋은 책이지만, 나는 makefile과 관련하여 뭔가를 선호합니다. –