如何定义自定义MacOSX框架/动态库的可选入口点

How to define an optional entry point into custom Mac OS X framework / dynamic library?

本文关键字:动态 入口 框架 何定义 定义 MacOSX 自定义      更新时间:2023-10-16

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

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

__attribute__((constructor))

__attribute__((destructor))

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

这样不行吗?

__attribute__((constructor)) void DllMain() 
{ 
  // code
} 

我认为malkia(upvoted)和Bavariant有正确的答案,但由于我已经查过了:一种方法是设置init例程。在库的Xcode构建设置中查找"初始化例程"。在函数名称前面加一个下划线。即,如果您的init例程名为DllMain,请输入"_DllMain"。

此外,我之前也使用obj-c++进行过一些初始化,比如:

class LibraryInit
{
    public LibraryInit()
    {
        // do some init stuff here
    }
} ;
static LibraryInit sLibraryInit();

我的主应用程序通过函数ABC静态链接到静态库a,我的动态库xyz.dlib也静态链接到具有相同函数ABC的相同静态库a。

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