【问题标题】:C++ Executing functions when a static library is loadedC++ 加载静态库时执行函数
【发布时间】:2012-09-26 13:10:10
【问题描述】:

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

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

我以类似于以下答案的方式解决了这个问题: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 文件包含在我的项目中的人。

那么有没有办法在库中执行代码而不链接到.h 文件?

【问题讨论】:

  • REGISTER(Foo) 永远不会被调用,它是一个宏......
  • @LuchianGrigore: static const int __classDescriptor... 通过 REGISTER(Foo) 调用。这就是我需要的,也是问题试图关注的。

标签: c++ ios static-libraries


【解决方案1】:

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

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

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

【讨论】:

  • 我必须创建一个新项目来测试它。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-07-18
    • 1970-01-01
    • 2021-10-26
    • 2012-04-03
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    相关资源
    最近更新 更多