moa*_*ala 22 c++ linker g++ global-variables static-libraries
直到前一段时间,我认为.a静态库只是.o目标文件的集合,只是归档它们而不是以不同的方式处理它们.但是链接到.o对象并链接到包含此.o对象的.a静态库显然是不一样的.我不明白为什么......
我们来考虑以下源代码文件:
// main.cpp
#include <iostream>
int main(int argc, char* argv[]) {
std::cout << "main" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
// object.hpp
#include <iostream>
struct Object
{
Object() { std::cout << "Object constructor called" << std::endl; }
~Object() { std::cout << "Object destructor called" << std::endl; }
};
Run Code Online (Sandbox Code Playgroud)
// object.cpp
#include "object.hpp"
static Object gObject;
Run Code Online (Sandbox Code Playgroud)
让我们编译并链接并运行以下代码:
g++ -Wall object.cpp main.cpp -o main1
./main1
> Object constructor called
> main
> Object destructor called
Run Code Online (Sandbox Code Playgroud)
构造函数是全局gObject对象的析构函数.
现在让我们从代码中创建一个静态库,并在另一个程序中使用(链接)它:
g++ -Wall -c object.cpp main.cpp
ar rcs lib.a object.o
g++ -Wall -o main2 main.o lib.a
./main2
> main
Run Code Online (Sandbox Code Playgroud)
谢谢.
Ark*_*nez 30
.a静态库包含几个,.o但除非您从主应用程序引用它们,否则它们不会链接.
.o文件独立链接总是.
所以.o链接器中的文件总是进入,引用或不引用,但是从.a文件中只引用引用的.o目标文件.
注意,静态全局对象不需要初始化,直到您实际引用编译单元中的任何内容,大多数编译器将在main之前初始化所有这些对象,但唯一的要求是它们在编译单元的任何函数获得之前被初始化执行.
| 归档时间: |
|
| 查看次数: |
8740 次 |
| 最近记录: |