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

标签 c macos gcc shared-libraries

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

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

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

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

问题是,这在 Mac OS X 上不起作用。有没有办法在 OS X 上做到这一点?

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

最佳答案

将全局放在 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

关于c - 从 OS X 上的 C 中的 dlopen()ed 动态库访问主程序全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1933667/

相关文章:

objective-c - 在 Cocoa/OSX 中读取用户默认值的最简单方法是什么?

c - 管道 stderr 到缓冲区

c - 在 Linux 上静态链接 libgmp 时出错

c - C 到毫秒是否有替代 sleep 功能?

c - libevent:从缓冲区读取所有字节

c - 二叉搜索树插入错误

objective-c - 为什么 reloadData 有效但 reloadItem 无效?

swift - Swift 中的全局修改键检测

gcc - 如何从 gcc(或其他地方)获取合法 ARM 操作码列表?

c++ - GNU 编译器优化