我使用类"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)