小编Con*_*ord的帖子

在C++中重复静态变量初始化

我使用类"MyClass"构建一个共享库"libMyLibrary.so",该类包含"MyClass"类型的静态变量.然后我构建了一个可执行文件"MyLibraryTest",我链接到"libMyLibrary.so".主程序使用"dlopen"动态加载作为参数给出的".so".

在构建时,库和可执行文件在目录中生成,例如"buildDir/bin".然后我将库安装到"installDir/lib",将可执行文件安装到"installDir/bin"(从可执行文件中删除运行时路径).

当我用LD_LIBRARY_PATH = buildDir运行"buildDir/MyLibraryTest buildDir/MyLibrary.so"时,一切都很好.

但是当我使用LD_LIBRARY_PATH = installDir/lib运行"buildDir/MyLibraryTest installDir/lib/MyLibrary.so"时,会发生一件非常奇怪的事情: - 静态变量的构造函数被调用两次(一次在dlopen之前,一次在dlopen期间) - 最后执行时,析构函数被调用两次,这导致崩溃.

这是我的代码:

MyClass.h

#ifndef _MyClass_h__
#define _MyClass_h__

#include <string>

class MyClass
{
private:
    static MyClass myStaticObjOfMyClass;
public:
    MyClass(const std::string& name, bool trace);
    virtual ~MyClass();
private:
    std::string myName;
    bool myTrace;
};

#endif // _MyClass_h__
Run Code Online (Sandbox Code Playgroud)

MyClass.cpp

#include "MyClass.h"
#include <iostream>

MyClass MyClass::myStaticObjOfMyClass("myStaticObjOfMyClass", true);

MyClass::MyClass(const std::string& name, bool trace) : myName(name), myTrace(trace)
{
    if (myTrace) std::cout << "MyClass::MyClass(name=" << myName << ", address=" << this << ")" << …
Run Code Online (Sandbox Code Playgroud)

c++ linux static dlopen

5
推荐指数
1
解决办法
641
查看次数

标签 统计

c++ ×1

dlopen ×1

linux ×1

static ×1