C++ C++;在加载静态库时执行函数
我需要在加载代码时注册类。我实现了一个解决方案,只要代码在应用程序中编译就可以了 但是,当代码由静态库提供时,它根本不起作用 我以类似于以下答案的方式解决了这个问题: 目前我有一些类似于:C++ C++;在加载静态库时执行函数,c++,ios,static-libraries,C++,Ios,Static Libraries,我需要在加载代码时注册类。我实现了一个解决方案,只要代码在应用程序中编译就可以了 但是,当代码由静态库提供时,它根本不起作用 我以类似于以下答案的方式解决了这个问题: 目前我有一些类似于: #define REGISTER(className)\ static const int __classDescriptor##className = MyRegister(#className, className::GetAllocator()); 使用时,它看起来像: //Foo.cpp REGI
#define REGISTER(className)\
static const int __classDescriptor##className = MyRegister(#className, className::GetAllocator());
使用时,它看起来像:
//Foo.cpp
REGISTER(Foo);
Foo::Foo()
{
...
}
我在日志中有:
registered class:Foo
但是当我创建了一个静态库并且库提供了Foo时,问题是REGISTER(Foo)代码>从未被调用
< >我有一个复杂的加载系统,允许脚本使用依赖于此行为的本机C++类。有没有办法在加载库时强制执行Foo.cpp中的代码
编辑:我的问题似乎与我的工作直接相关。看来我自己的图书馆也有同样的问题。我注意到图书馆的一些课程已经注册了。他们是唯一在我的项目中包含.h
文件的人
那么,有没有一种方法可以在不链接到.h
文件的情况下执行库中的代码?在调用依赖于我的类描述符的任何其他代码之前,初始化我的类描述符的唯一方法是初始化库
我添加了一个函数MyLibraryInit()
,它在每个\uuuu类描述符##类名称
上调用一个函数,以强制初始化每个描述符
不幸的是,这似乎是我能找到的最优雅的方法。使用-all\u load linker选项加载静态库的所有成员。或者对于特定的库,使用-force_load path_to_archive
在Xcode中,您需要在可执行文件(而不是静态库)的“其他链接器标志”下添加这些选项
这解决了我的静态初始化函数的问题。REGISTER(Foo)
永远不会被调用,它是一个宏…@LuchianGrigore:static const int\uu classDescriptor。。。通过寄存器(Foo)调用。这就是我需要的,也是问题的重点。我必须做一个新的项目来测试这一点。