5

在 Windows 中,有一个DllMainDLL_PROCESS_ATTACH / DLL_PROCESS_DETACH标志,它们允许在DLL附加到进程后初始化/释放资源......那么在OS X的情况下如何指定入口点?与往常一样,我在 Apple 文档中找不到任何有用的东西 :(

4

4 回答 4

4

那不行吗?

__attribute__((constructor)) void DllMain() 
{ 
  // code
} 
于 2011-06-02T06:35:44.463 回答
4

Apple 网站上的动态库编程主题文档显示了使用

__attribute__((constructor))

__attribute__((destructor))

在动态库中实现初始化器和终结器。

于 2011-06-02T06:41:08.723 回答
2

我认为 malkia (upvoted) 和 Bavarious 有正确的答案,但因为我已经查过了:一种方法是设置你的 init 例程。在您的库的 Xcode 构建设置中查找“初始化例程”。使用下划线作为函数名称的前缀。即,如果您的 init 例程称为 DllMain,请输入“_DllMain”。

另外,我之前使用 obj-c++ 进行了一些初始化,如下所示:

class LibraryInit
{
    public LibraryInit()
    {
        // do some init stuff here
    }
} ;
static LibraryInit sLibraryInit();
于 2011-06-02T06:54:30.847 回答
0

我的主应用程序静态链接到具有函数 ABC 的静态库 A,而我的动态库 xyz.dylib 也静态链接到具有相同函数 ABC 的同一个静态库 A。

现在,当主应用程序在运行时使用 dlopen 加载 xyz.dylib 时。初始化程序在我调用 ABC 函数的地方被调用。此函数 ABC 正在从主应用程序的地址空间中调用。这真的很奇怪,我不知道,出了什么问题?虽然它应该从 dylib 调用 ABC 函数。

于 2013-10-03T13:51:48.497 回答