문제

얼마 전까지까지, 나는 정적 라이브러리가 단지 .O 객체 파일의 모음 일 뿐이라고 생각했다. 하지만 .o 객체와 연결 하고이 .o 객체를 포함하는 정적 라이브러리와 연결하는 것은 분명히 동일하지 않습니다.. 그리고 왜 그런지 이해하지 못합니다 ...

다음과 같은 소스 코드 파일을 고려해 봅시다.

// main.cpp
#include <iostream>
int main(int argc, char* argv[]) {
    std::cout << "main" << std::endl;
}

// object.hpp
#include <iostream>
struct Object
{
    Object() { std::cout << "Object constructor called" << std::endl; }
    ~Object() { std::cout << "Object destructor called" << std::endl; }
};

// object.cpp
#include "object.hpp"
static Object gObject;

컴파일하고 링크 이 코드를 실행하십시오.

g++ -Wall object.cpp main.cpp -o main1
./main1
> Object constructor called
> main
> Object destructor called

생성자는 글로벌 gobject 객체의 파괴자를 호출합니다.

이제 a 정적 라이브러리 우리의 코드 및 사용 (링크)에서 다른 프로그램에서 :

g++ -Wall -c object.cpp main.cpp
ar rcs lib.a object.o
g++ -Wall -o main2 main.o lib.a
./main2
> main
  • Gobject의 생성자와 소멸자는 호출되지 않습니다 ... 왜?
  • 자동으로 전화하는 방법은 무엇입니까?

감사.

도움이 되었습니까?

해결책

.a 정적 라이브러리에는 여러 가지가 포함되어 있습니다 .o 그러나 메인 앱에서 참조하지 않으면 연결되어 있지 않습니다.
.o 항상 독립형 링크.

그래서 .o 링커의 파일은 항상 참조 여부에 따라 내부로 들어가지 만 .a 파일 만 참조했습니다 .o 객체 파일이 연결되어 있습니다.

참고로, 정적 글로벌 객체는 컴파일 장치에서 실제로 무엇이든 참조 할 때까지 초기화 할 필요가 없습니다. 대부분의 컴파일러는 메인 전에 모든 컴파일러를 초기화하지만 컴파일 장치의 기능이 가져 오기 전에 초기화되는 것입니다. 실행.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top