2

我需要在加载代码时注册类。只要代码在应用程序中编译,我实现了一个很好的解决方案。

但是当代码由静态库提供时,它根本不起作用。

我以类似于此答案的方式解决了这个问题: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 中的代码?


编辑:看来我的问题与Visual Studio 中关于静态链接的问题直接相关。看来我自己的库也有同样的问题。我注意到库中的一些类已注册。他们只是将他们的.h文件包含在我的项目中的人。

那么有没有办法在不链接到.h文件的情况下在 lib 中执行代码?

4

2 回答 2

4

使用 -all_load 链接器选项加载静态库的所有成员。或者对于特定库,使用 -force_load path_to_archive。

在 Xcode 中,您需要在“其他链接器标志”下为您的可执行文件(而不是静态库)添加这些选项。

这解决了我的静态初始化函数的问题。

于 2013-09-07T21:50:08.340 回答
1

在调用依赖它们的任何其他代码之前初始化我的类描述符的唯一方法是初始化库。

我添加了一个函数MyLibraryInit(),它在每个函数上调用一个函数__classDescriptor##className来强制初始化每个描述符。

不幸的是,这似乎是我能找到的最优雅的方法。

于 2012-12-31T02:11:45.793 回答