2009-03-17 2 views
43

두 파일 유형의 차이점은 무엇입니까? 실행 파일을 생성하는 동안 두 유형 모두에 대해 내 C++ 앱이 연결되는 것을 볼 수 있습니다..o 파일 대 .a 파일

.a 파일을 빌드하는 방법은 무엇입니까? 링크, 참고 문헌, 특히 예제는 매우 높이 평가됩니다.

답변

46

.o 파일은 개체입니다. 그것들은 컴파일러의 출력이고 링커/사서에게 입력됩니다.

.a 파일은 아카이브입니다. 그것들은 객체 또는 정적 라이브러리의 그룹이며 링커에도 입력됩니다.

나는 당신의 질문의 "예"부분을 알아 차리지 않았다

추가 콘텐츠. 일반적으로 makefile을 사용하여 정적 라이브러리를 생성합니다.

AR = ar 
CC = gcc 

objects := hello.o world.o 

libby.a: $(objects) 
    $(AR) rcu [email protected] $(objects) 

%.o: %.c 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

이 객체로 hello.cworld.c를 컴파일 한 후 라이브러리로 보관. 플랫폼에 따라 ranlib 유틸리티를 실행하여 아카이브에서 목차를 생성해야 할 수도 있습니다.

재미있는 쪽지 : .a 파일은 기술적으로는 보관 파일이고 라이브러리는 아닙니다. 훨씬 오래된 파일 형식을 사용하지만 압축하지 않은 zip 파일과 유사합니다. ranlib과 같은 유틸리티에서 생성 된 목차는 보관 파일을 라이브러리으로 만드는 것입니다. Java 아카이브 파일 (.jar)은 Java 아카이버에 의해 작성된 특수 디렉토리 구조가있는 zip 파일과 유사합니다.

+1

이 만들기의 주제에 있지만 그냥 추가 거라고 생각 "부분"('$이 페이지에서 검색 '$ <'또는'$ ^'를 사용하여'libby.a' 타겟의'(AR) rcu $ @ $ (objects)')에 각각 첫 번째 또는 모든 필수 타겟을 참조합니다.이것은 동일한 효과를 가지지 만'$ (objects) '를 두 번 지정하는 중복을 제거하고 변수 이름이나 전제 조건이 변경되면 두 곳에서 참조를 업데이트해야하며 코드도 적습니다. –

+1

@ShammelLee - 보통'$ ^'은 GNU Make 확장이며 [BSD make] (https://www.freebsd.org/cgi/man.cgi?make (1)) 또는 [POSIX make] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/make.html). 대부분의 리눅스 배포판은 GNU 기반이지만 bash에서 대시로의/bin/sh 전환으로 GNU 특정 확장을 계속 피할 수 있습니다. –

+0

잘 알고 있습니다. 감사. –

1

.a 파일은 여러 개의 오브젝트 파일을 포함 할 수있는 아카이브라고 생각합니다.

14

.o 파일은 단일 컴파일 단위 (본질적으로 헤더 파일이 연결된 소스 코드 파일)를 컴파일 한 결과이며 .a 파일은 하나 이상의 .o 파일을 라이브러리로 패키지화 한 결과입니다.

5

당신은 .o 파일 (오브젝트 파일) 자세한 내용은

참조 man ar에서 .a 파일 (정적 라이브러리)을 만들 ar를 사용할 수 있습니다.

11

D Shawley의 대답이 좋았습니다. 다른 답변은 무슨 일이 일어나고 있는지에 대한 불완전한 이해를 반영하기 때문에 몇 가지 점을 추가하고 싶었습니다.

보관 파일 (.a)은 개체 파일 (.o)을 포함하는 것으로 제한되지 않습니다. 그들은 임의의 파일을 포함 할 수 있습니다. 자주 유용하지는 않지만 어리석은 링커 트릭을 보려면 dynamic linker dependenciy info embedded in an archive을 참조하십시오.

오브젝트 파일 (.o)이 반드시 단일 컴파일 단위의 결과 일 필요는 없습니다. 여러 개의 작은 오브젝트 파일을 하나의 큰 파일로 부분적으로 연결할 수 있습니다.

http://www.mihaiu.name/2002/library_development_linux/ - 레시피 라인에`당신은 또한`$ (객체)를 대체 할 수 있습니다,