programing

.o 파일 대 .a 파일

prostudy 2022. 5. 19. 22:37
반응형

.o 파일 대 .a 파일

이 두 파일 타입의 차이점은 무엇인가?실행 파일을 구성하는 동안 내 C++ 앱이 두 가지 유형 모두에 대해 링크되는 것을 본다.

.a 파일을 만드는 방법?링크, 참고문헌, 그리고 특히 예시는 높이 평가된다.

.o파일은 객체다.컴파일러의 출력물이며 링커/라이브러리맨에 대한 입력물이다.

.a파일은 보관 파일이다.이들은 객체 또는 정적 라이브러리의 그룹이며 링커에 입력되기도 한다.

추가 내용

나는 너의 질문에서 "예시" 부분을 알아차리지 못했다.일반적으로 정적 라이브러리를 생성하기 위해 makefile을 사용한다.

AR = ar 
CC = gcc

objects := hello.o world.o

libby.a: $(objects)
    $(AR) rcu $@ $(objects)

%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@

이것은 컴파일할 것이다.hello.c그리고world.c객체에 보관한 후 라이브러리에 보관하십시오.플랫폼에 따라, 당신은 또한 "라는 유틸리티"를 실행해야 할 수도 있다.ranlib보관에 목차를 생성한다.

흥미로운 사이드 노트:.a파일은 기술적으로 아카이브 파일이지 라이브러리가 아니다.훨씬 오래된 파일 형식을 사용하지만 압축이 없는 zip 파일과 유사하다.다음과 같은 유틸리티에 의해 생성된 목차ranlib아카이브를 도서관으로 만드는 겁니다Java 아카이브 파일(.jar)은 Java Archiver에 의해 만들어진 특별한 디렉토리 구조를 가진 zip 파일이라는 점에서 유사하다.

.o 파일은 라이브러리로 패키지된 하나 이상의 .o 파일인 반면, .o 파일은 단일 컴파일 단위(기본적으로 소스 코드 파일, 관련 헤더 파일)를 컴파일한 결과물이다.

에 대항하여 연결시키는 한 가지 측면이 더 있다..a.o파일: 링크할 때, 모두.o인수가 최종 실행 파일에 포함되는 동안 전달된 s의 항목.a인수는 프로그램의 기호 종속성을 해결하는 경우에만 링커 출력에 포함된다.

좀 더 구체적으로, 각각.a파일은 여러 개의 파일로 구성된 보관 파일이다..o파일들. 당신은 각각의 파일들을 생각할 수 있다..o암호의 원자 단위가 되는 것.링커에 이러한 장치 중 하나의 기호가 필요한 경우, 전체 장치가 최종 2진수로 빨려 들어가지만, 다른 장치도 마찬가지로 필요하지 않은 경우에는 없다.

이와는 대조적으로 a를.o당신이 요청했기 때문에 링커가 빨아들인다

이를 설명하기 위해 다음 예를 들어, 두 개의 객체로 구성된 정적 라이브러리가 있는 경우a.o그리고b.o우리 프로그램은 단지 다음 기호만을 참조할 것이다.a.o우리는 링커가 패스를 어떻게 다루는지 비교할 것이다.a.o그리고b.o동일한 두 개 객체로 구성된 정적 라이브러리 대 함께.

// header.hh
#pragma once

void say_hello_a();
void say_hello_b();
// a.cc
#include "header.hh"
#include <iostream>

char hello_a[] = "hello from a";

void say_hello_a()
{
        std::cout << hello_a << '\n';
}
// b.cc
#include "header.hh"
#include <iostream>

char hello_b[] = "hello from b";

void say_hello_b()
{
        std::cout << hello_b << '\n';
}
// main.cc
#include "header.hh"

int main()
{
        say_hello_a();
}

다음 Makefile을 사용하여 코드를 컴파일할 수 있다.

.PHONY = compile archive link all clean

all: link

compile:
        @echo ">>> Compiling..."
        g++ -c a.cc b.cc main.cc

archive: compile
        @echo ">>> Archiving..."
        ar crs lib.a a.o b.o

link: archive
        @echo ">>> Linking..."
        g++ -o main_o main.o a.o b.o
        g++ -o main_a main.o lib.a

clean:
        rm *.o *.a main_a main_o

그리고 두 개의 실행 파일을 얻는다.main_o그리고main_a의 내용이 다르다는 점에서a.cc그리고b.cc 30분 려면 된다..os 첫 번째 사례에서 그리고 완전히.a둘째로

마지막으로 다음 항목을 사용하여 최종 실행 파일의 기호를 검사한다.nm도구:

$ nm --demangle main_o | grep hello
00000000000011e9 t _GLOBAL__sub_I_hello_a
000000000000126e t _GLOBAL__sub_I_hello_b
0000000000004048 D hello_a
0000000000004058 D hello_b
0000000000001179 T say_hello_a()
00000000000011fe T say_hello_b()
$ nm --demangle main_a | grep hello
00000000000011e9 t _GLOBAL__sub_I_hello_a
0000000000004048 D hello_a
0000000000001179 T say_hello_a()

그리고 그것을 관찰하다.main_a사실 에 필요없는 상징이 부족하다.b.o. 즉, 링커는 의 내용을 빨아들이지 않았다.b.o기록 보관소 내에lib.a왜냐하면 어떤 기호도 의 것이 아니기 때문이다.b.cc참조되었다.

사용할 수 있다ar창조하다.a파일(정적 라이브러리).o파일(개체 파일)

참조man ar자세한 것은

.a 파일은 여러 개체 파일을 포함할 수 있는 아카이브라고 생각한다.

D Shawley의 대답은 좋다, 나는 단지 다른 대답들이 무슨 일이 일어나고 있는지에 대한 불완전한 이해를 반영하고 있기 때문에 몇 가지 포인트를 추가하고 싶었다.

아카이브 파일(.a)은 개체 파일(.o)을 포함하는 것으로 제한되지 않는다는 점에 유의하십시오.임의 파일을 포함할 수 있다.자주 유용하지는 않지만 보관소에 포함된 동적 링커 종속 정보를 참조하십시오.

또한 객체 파일(.o)이 반드시 단일 컴파일 단위의 결과는 아니라는 점에 유의하십시오.여러 개의 작은 오브젝트 파일을 하나의 큰 파일로 부분적으로 연결할 수 있다.

http://www.mihaiu.name/2002/library_development_linux/ - 이 페이지에서 "검색"

참조URL: https://stackoverflow.com/questions/654713/o-files-vs-a-files

반응형