小编eos*_*rox的帖子

当两个共享库定义相同的符号时实际上会发生什么?

我最近在将两个共享库(都是我自己制作的)链接在一起时遇到了崩溃问题。我最终发现这是因为两个文件之间有一个源文件重复。在该源文件中定义了一个全局 std::vector (实际上是类的静态成员),它最终被释放两次——每个库释放一次。

然后我写了一些测试代码来验证我的想法。在标头中,我声明了一个类和该类的全局对象:

#ifndef SHARED_HEADER_H_
#define SHARED_HEADER_H_

#include <iostream>

struct Data {
  Data(void) {std::cout << "Constructor" << std::endl;}
  ~Data(void) {std::cout << "Destructor" << std::endl;}
  int FuncDefinedByLib(void) const;
};

extern const Data data;

#endif
Run Code Online (Sandbox Code Playgroud)

FuncDefinedByLib函数未定义。然后我创建了两个库,libA并且libB都包含这个标头。 libA看起来像这样

const Data data;

int Data::FuncDefinedByLib(void) const {return 1;}

void PrintA(void) {
  std::cout << "LibB:" << &data << " "
    << (void*)&Data::FuncDefinedByLib <<  " "
    << data.FuncDefinedByLib() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

它定义了全局data对象、函数以及打印对象地址、 的地址和 的返回值的FuncDefinedByLib …

c++ shared-libraries

6
推荐指数
1
解决办法
2175
查看次数

标签 统计

c++ ×1

shared-libraries ×1