.a .o와 .lo 파일의 차이점
C에서 .a .o와 .lo파일 의 차이점은 무엇입니까 ?
'.lo'파일은 공유 라이브러리에 빌드 될 수 있는 라이브러리 객체 이고 '.o'파일은 표준 객체 파일입니다.
.lo 파일은 Libtool이 공유 라이브러리에 빌드 할 수있는 객체 파일을 결정하는 데 사용 하는 libtool 객체입니다 .
.o, .a, .lo 및 .so의 차이점.
요약
- .o 는 일반적으로 컴파일러에서 내 보낸 비 PIC 개체 파일입니다 (링커 단계 전). exe와 연결되면 코드가 실행 파일에 포함됩니다. 링크 타임에 바인딩합니다.
- .a 는 일반적으로 하나 이상의 .o 파일 [비 PIC]을 포함하는 아카이브 라이브러리 입니다. exe와 연결되면 아카이브의 특정 "* .o"파일이 실행 파일에 삽입됩니다.
- .lo 는 일반적으로 gcc -fPIC 또는 libtool을 사용하여 수동으로 컴파일 된 PIC 코드를 포함하는 "라이브러리 객체"입니다 .
- .so 파일은 "공유 개체"파일입니다. 여기에는 PIC 개체가 포함됩니다.
노트 :
- 정적 실행 파일이 필요한 경우 ".o"및 ".a"파일을 사용하십시오.
- 런타임에 라이브러리와의 바인딩을 동적 실행 파일이 필요하거나 원하면 .lo 및 .so 파일을 사용 하십시오.
소개
위의 답변은 마음에 들지만 .a / archive 라이브러리 양식은 다루지 않습니다. 그래서 여기서는 .so 라이브러리 형식을 추가하는 보너스로 세 가지 모두를 다룰 것입니다. 또한 stackexchange의 맥락에서 링크가 끊어 질 경우 더 많은 텍스트를 사용할 것입니다 (이 링크에는 참조 링크가 필요하지 않음).
파일 형식 .o
.o 파일을 컴파일 할 때 대상 플랫폼에 대한 컴파일러에서 내 보낸 개체 코드를 포함하는 개체 파일입니다. .o 파일 을 만들려면 :
gcc -c filename.c <==== creates filename.o
이 예제는 PIC (Position Independent Code)를 생성하지 않았습니다. 이를 정적 라이브러리 또는 실행 파일에 포함 할 수있는 개체로 간주합니다. 즉, 실행 파일을 .o 파일 과 연결하면 .o 파일의 코드가 실행 파일에 삽입됩니다. --- 실행 시간이 아닌 빌드 시간에 바인딩됩니다. 즉, .o 파일을 포함하지 않고 실행 파일을 재배포 할 수 있습니다. 주의 사항 : .o 파일은 PIC가 아닌 것으로 간주 되는 것이 관례입니다 . 일반적으로 확장명 이 .lo 인 PIC 개체 파일의 이름을 지정 합니다.
파일 형식 .a
.A의 파일 형식은 "있는 아카이브 "라이브러리입니다. 하나 이상의 .o 파일을 포함하며 일반적으로 정적 실행 파일을 만드는 데 사용됩니다.
ar 명령을 사용하여 아카이브 라이브러리를 조작합니다. 아래의 예에서는 (1) .o 파일 에서 아카이브 라이브러리를 만든 다음 (2) 하나의 내용을 나열합니다.
라이브러리 생성
$ ls *.o
a.o b.o c.o <=== the files going in the archive
$ ar q libmyStuff.a *.o <=== put *.o files in an archive (or new one)
ar: creating libmyStuff.a
$ ls *.a <=== just show the library created
libmyStuff.a
아카이브 라이브러리의 내용 표시
$ ar t libmyStuff.a
a.o
b.o
c.o
파일 형식 .lo
의 사용 .lo는 종종 위치 독립적 인 객체 파일에 사용되는 규칙이다. 현재 디렉토리에서 libtool compile 명령은 .lo 파일과 .o 파일을 모두 만듭니다 . 하나는 PIC 코드가 있고 다른 하나는 PIC 코드가 없습니다. 아래 출력을 참조하십시오.
$ libtool compile gcc -c a.c
libtool: compile: gcc -c a.c -fPIC -DPIC -o .libs/a.o <== PIC code
libtool: compile: gcc -c a.c -o a.o >/dev/null 2>&1 <== Not-PIC code
$ ls a.lo a.o
a.lo a.o <=== a.lo contains the PIC code.
또한 .libs 하위 디렉토리는 ao 를 사용하여 생성되었습니다 . 이 파일은 이름에도 불구하고 PIC 코드입니다. Libtool 은이 파일을 현재 디렉토리로 이동하고 확장자를 .lo로 변경했습니다 .
컴파일 할 때 gcc에 PIC 옵션을 사용하여 항상 수동으로 .lo 파일을 만들 수 있습니다 . 결과 .o 파일을 .lo 확장자로 이동하십시오 .
파일 형식 .so
By convention .so implies a "shared object" library file. We put PIC object files into shared libraries. In contract to .o and .a files, when we link with .so files the code is not included in the resulting compiled file. That is we use run time binding (as in the .lo case). There is more than one form of runtime binding, but we won't go into that here.
The .lo file is a library object, which may be built into a shared library, and the .o file is a standard object file. More info: How to install and use libtool shared library (.lo files)?
참고URL : https://stackoverflow.com/questions/5895649/difference-between-a-o-and-lo-file