静的ライブラリのグローバルの静的初期化と破壊はg ++では発生しません
-
05-07-2019 - |
質問
しばらく前まで、.a静的ライブラリは.oオブジェクトファイルの単なるコレクションであり、アーカイブするだけで、異なる処理を行わないように考えていました。しかし、 .oオブジェクトとのリンクと、この.oオブジェクトを含む.a静的ライブラリとのリンクは、明らかに同じではありません。理由がわかりません...
次のソースコードファイルについて考えてみましょう。
// 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オブジェクトのデストラクタであるコンストラクタが呼び出されます。
ここで、コードから静的ライブラリを作成し、別のプログラムで使用(リンク)します。
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
オブジェクトファイルのみが参照されますリンクされています。
注として、静的グローバルオブジェクトは、コンパイル単位で実際に何かを参照するまで初期化する必要はありません。ほとんどのコンパイラはメインの前にすべてを初期化しますが、唯一の要件は、コンパイル単位が実行されます。
所属していません StackOverflow