我需要在加载代码时注册类。我实现了一个解决方案,只要在应用程序中编译代码就可以运行。
但是当代码由静态库提供时,它根本不起作用。
我以类似于这个答案的方式解决了这个问题:https://stackoverflow.com/a/729028/171711。
目前我有类似的东西:
#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中的代码在加载库时执行?
修改:我的问题似乎与the one about static linking in Visual Studio直接相关。看来我对自己的库有同样的问题。我注意到库中的一些类已经注册。而且他们只是我的项目中包含.h
文件的人。
那么有没有一种方法可以在lib中执行代码而无需链接到.h
文件?
答案 0 :(得分:4)
使用-all_load链接器选项加载静态库的所有成员。或者对于特定库,请使用-force_load path_to_archive。
在Xcode中,您需要在“Other Linker Flags”下为您的可执行文件(而不是静态库)添加这些选项。
这解决了我的静态初始化函数的问题。
答案 1 :(得分:1)
在调用依赖它们的任何其他代码之前初始化类描述符的唯一方法是初始化库。
我添加了一个函数MyLibraryInit()
,它在每个__classDescriptor##className
上调用一个函数来强制每个描述符的初始化。
不幸的是,这似乎是我能找到的最优雅的方法。