我最近在将两个共享库(都是我自己制作的)链接在一起时遇到了崩溃问题。我最终发现这是因为两个文件之间有一个源文件重复。在该源文件中定义了一个全局 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 …