【发布时间】:2020-11-05 14:17:10
【问题描述】:
下面的场景让我很感兴趣。
(A)源代码库。
(B) 包含(A) 的共享库
(C) 包含(A) 的静态库
(D),与(B) 和(C) 链接的顶级程序。
以前我阅读了以下答案并理解,如果链接是静态的,则变量是真正的静态变量,并且在整个程序中只存在一次,但如果链接是动态的,则静态变量存在的次数与包含库的次数一样多。 What happens to static variables when libraries are statically linked
例如,如果我在下面的代码中包含 N 次静态库,__immediately_lambda_call 会被触发 N 次,但会访问相同的 gMyClass。
static MyClass& GetSingleton() {
static std::once_flag flag;
static MyClass* gMyClass;
std::call_once(flag, [&]() { gMyClass = new MyClass(); });
return *gMyClass;
}
static const auto __immediately_lambda_call = []() {
auto& gMyClass = GetSingleton();
return true;
}();
但是当相同的代码被包含为动态库和静态库时会发生什么。
请随意忽略下一段。我更关心静态库和动态库之间如何共享内存。
问题是因为顶级程序(D)在更复杂的代码中随机向我抛出double free memory错误,我将其总结为以下代码,我不明白为什么,但是在动态时添加__attribute__((visibility( hidden ))编译库似乎解决了这个问题。
static const int gMyArr[2] = {1,2};
static const int gMyNum = 1;
class API_STATIC_DYNAMIC MyOtherClass
{
public:
MyOtherClass()
: mMatrix(new int[20])
{}
MyOtherClass()
{
delete[] mMatrix;
}
void doSomething()
{
int d = gMyArr[0];
}
static int gMatrix[10];
static int gNumber;
private:
int *mMatrix;
}
编辑库:
API.h
#if defined(STATIC_LIB)
#define API_STATIC_DYNAMIC
#else
#define API_STATIC_DYNAMIC __attribute__((visibility("hidden"))) // removed "default"
#endif
MYLIB.h
class MyLibApi
{
public:
void doSomething();
private:
class MyLibImp;
MyLibImp *mPimpl;
}
MYLIB.cpp
class MyLibImp()
{
public:
MyOtherClass myOther;
}
void MyLibApi::doSomething()
{
mPimpl->myOther->doSomething();
}
编辑应用程序:
int main()
{
MyLibApi api;
api.doSomething();
MyOtherClass other;
other.doSomething();
return 0;
}
【问题讨论】:
-
请在您的问题中提供一些minimal reproducible example。考虑使用一些开源许可证在github.com 上发布您的 C++ 代码
标签: c++ static shared-libraries static-libraries static-variables