从OS X上的C中的dlopen()ed动态库访问主程序全局变量

时间:2009-12-19 17:58:26

标签: c macos gcc shared-libraries

我正在维护一个small application,它具有一些类似插件的功能,这是通过运行时加载的动态模块实现的。

具体来说,由于它是一个Gtk +应用程序,我使用gmodule,但问题也适用于基于dlfcn.h / dlopen()的动态库加载。

我的主程序有一个包含一些全局信息的全局结构变量。我希望这些信息可用于动态加载的插件中定义的函数。

在Linux上,我可以直接引用这个全局变量 - 这很好用,我猜测gcc或链接器负责将全局变量从主程序导出到动态库。

问题是,这在Mac OS X上不起作用。有没有办法在OS X上执行此操作?

如果没有,是否有更多的“最佳实践”方法将全局信息公开给动态加载的库?

2 个答案:

答案 0 :(得分:9)

将global放在main.c中并在共享对象中声明它为extern,并尝试:

MACOSX_DEPLOYMENT_TARGET=10.3 ld -dylib -undefined dynamic_lookup -o multiply.so multiply.o

MACOSX_DEPLOYMENT_TARGET=10.3 libtool -dynamic -undefined dynamic_lookup -o multiply.so multiply.o

在Mac OS X 10.4上它适用于我

答案 1 :(得分:3)

因为你宣布

int global;

在multiply.h头文件中,DLL和主程序都有自己的副本。相反,在main.c中声明全局

int global;

并在multiply.c中将其声明为extern:

extern int global;

现在,如果将main.cpp与-rdynamic选项链接,则可执行文件的符号将导出到DLL。

我在linux下测试了这个并且它有效,但我担心我无法访问MacOS上的测试。由于你的ssample代码也不适用于linux,我希望这是问题所在。