我正在使用Cygwin / Windows中的二进制文件,其中某些库与dlopen(path.c_str(), RTLD_LAZY);
一起加载,但在这种情况下,C ++单例模式似乎不起作用。即使主程序使用Singleton::initInstance(some,params);
调用初始化单例,该调用设置了类的私有static Singleton* ptr;
字段,调用Singleton::getInstance();
的共享库然后应该检索{{1作为初始化值,它返回ptr
。我试图通过在主程序中定义nullptr
来解决问题,该Singleton *sharedsingleton;
可以通过extern
调用在其他模块中访问,但即使在这种情况下,sharedsingleton
似乎也是nullptr
{1}}。我怎么能解决我的问题?我按如下方式编译库:
INT_FILES := $(CPP_FILES:.cpp=.o)
OBJ_FILES := $(INT_FILES:.o=.plugin)
CC_FLAGS := -g -c -std=c++11 -I../../src -I../../ext-libs -DWINDOWS
CC_SHARED := -shared -Wl,--export-all-symbols -Wl,--enable-auto-import -Wl,--export-all-symbols -Wl,--no-whole-archive ../../src/agent/*.o -Wl,--no-whole-archive ../../src/graph/*.o -Wl,--no-whole-archive ../../src/event/*.o -Wl,--no-whole-archive ../../src/plugin-loader/*.o -Wl,--no-whole-archive ../../src/*.o
CC_JSONO := ../../ext-libs/json/json.cpp
all: $(INT_FILES) $(OBJ_FILES)
%.o: %.cpp
g++ $(CC_FLAGS) -o $@ $<
%.plugin: %.o
g++ $(CC_SHARED) -o $@ $<
提前感谢(同样的程序似乎在Linux下工作,使用不同的编译标志(-fPIC等))。