相关疑难解决方法(0)

使用g ++不会发生静态初始化和破坏静态库的全局变量

直到前一段时间,我认为.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++ …
Run Code Online (Sandbox Code Playgroud)

c++ linker g++ global-variables static-libraries

22
推荐指数
1
解决办法
8740
查看次数

静态库和动态库:混乱

我在这方面几乎无需澄清.我觉得条款Static libraryDynamic Library不正确.

  • lib1.o + lib2.o + lib3.o - >"LinkerOutputFile"(可执行文件或库).
  • 如果这个"LinkerOutputFile"包含所有文件lib1.o,lib2.o,lib3.o的代码,那么它表示"LinkerOutputFile"是静态链接的"LinkerOutputFile"(可执行文件或库).(要么)

  • 如果"LinkerOutputFile"只包含有关 lib1.o,lib2.o,lib3.o的引用和其他信息,而不包含这些lib*.o文件的代码.然后它表示"LinkerOutputFile"动态链接.

这如何使lib*.o文件成为静态库或动态库?它们只是库文件.

或者是,"LinkerOutputFile"是一个库而不是可执行文件,这取决于它是静态链接还是动态链接它的被称为静态库或动态库.对或错?

我知道我错了,因为,我知道

在大多数unix风格的平台上,扩展名是

  • .a用于静态库(档案)和
  • .so用于共享库.

在Windows上:

  • .dll表示共享库
  • .lib表示静态或导入库.

但无法弄清楚我错在哪里.另外请告诉我内部Static libraryDynamic Library内部有何不同.

此外,这是来自ABI规范:

本章介绍目标文件格式,称为ELF(可执行文件和链接格式).目标文件有三种主要类型.

重定位文件保存代码和数据适合于与其他目标文件链接到创建可执行文件或共享对象文件.

一个可执行文件保持合适的用于执行的程序; 该文件指定exec(BA_OS)如何创建程序的过程映像.

共享对象文件保存代码和适合于在两个上下文链接数据.首先,链接编辑器[请参阅ld(BA_OS)]使用其他可重定位和共享对象文件处理共享对象文件,以创建另一个目标文件.其次,动态链接器将其与可执行文件和其他共享对象相结合,以创建过程映像.

"共享对象文件"是说动态库(具有*.so扩展名)的其他词.但是"静态库"怎么样?这甚至没有提到它.

"可重定位"和"静态库"和"导入库"之间有什么区别吗?请用内部结构澄清我.

linker shared-libraries static-libraries

6
推荐指数
2
解决办法
4709
查看次数