.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분 려면 된다..o
s 첫 번째 사례에서 그리고 완전히.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
'programing' 카테고리의 다른 글
부트스트랩-vue 입력 번호 Vue.js의 최대 길이 (0) | 2022.05.19 |
---|---|
Vuejs - 인스턴스에 정의되지 않은 계산된 속성 (0) | 2022.05.19 |
지원되지 않는 major.minor 버전 52.0 (0) | 2022.05.19 |
java.lang은 무엇을 하는가.스레드.인터럽트()가? (0) | 2022.05.19 |
정렬 가능에서 비활성화 옵션을 사용하는 방법부에 프로젝트에서 JS? (0) | 2022.05.19 |