C++ 如何定义自定义Mac OS X框架/动态库的可选入口点?

C++ 如何定义自定义Mac OS X框架/动态库的可选入口点?,c++,macos,dll,frameworks,entry-point,C++,Macos,Dll,Frameworks,Entry Point,在Windows中有一个DllMain和DLL\u PROCESS\u ATTACH/DLL\u PROCESS\u DETACH标志,允许在DLL附加到进程后初始化/释放资源。。。那么,在操作系统X的情况下,如何指定入口点呢?和往常一样,我在苹果的文档中找不到任何有用的东西:(这不管用吗 __attribute__((constructor)) void DllMain() { // code } 苹果网站上的文件显示了 __attribute__((constructor))

在Windows中有一个DllMainDLL\u PROCESS\u ATTACH/DLL\u PROCESS\u DETACH标志,允许在DLL附加到进程后初始化/释放资源。。。那么,在操作系统X的情况下,如何指定入口点呢?和往常一样,我在苹果的文档中找不到任何有用的东西:(

这不管用吗

__attribute__((constructor)) void DllMain() 
{ 
  // code
} 
苹果网站上的文件显示了

__attribute__((constructor))

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

我认为malkia(upvoted)和Bavaried的答案是正确的,但因为我已经查过了:一种方法是设置初始化例程。查找“初始化例程”在库的Xcode生成设置中。在函数名前加下划线。例如,如果初始化例程名为DllMain,请输入“\u DllMain”

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

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

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


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

是的,似乎是这样这是我所期待的有趣的。对于记录,这相当于链接标志<代码> init < /C>。我赞成这个,因为它更便携(虽然C++特定)。一个可能不适用于这种方法的东西(和某些编译器/链接器,如MSVC)。如果它最终出现在库中,它可能不会被调用。我可能有关于这方面的旧信息,但在过去(我们的工作室)发生过很多次。通常我们将sLibraryInit()声明为外部的,并且在主项目中至少有一个地方,我们引用了它。这是比我更完整的答案。
class LibraryInit
{
    public LibraryInit()
    {
        // do some init stuff here
    }
} ;
static LibraryInit sLibraryInit();