【问题标题】:Aliasing class symbol name别名类符号名称
【发布时间】:2018-08-21 06:31:17
【问题描述】:

我在几个嵌套命名空间android::hardware::camera::common::V1_0::helper::CameraParameters 中有一个类,我想将其作为android::CameraParameters 提供,因此,在编译的二进制文件中,指向该类的符号看起来像_ZN7android16CameraParameters 而不是@ 987654325@。这可能吗?

我需要这样做以在不编辑源文件的情况下向另一个(预构建,没有可用的源代码,库)提供一些缺失的符号。

【问题讨论】:

  • @JeJo 这是我尝试的第一件事,结果符号仍然是完整的命名空间。
  • 除了 JeJo:如果你从android::hardware::camera::common::V1_0::helper::CameraParameters 派生出android::CameraParameters 会怎样?它会产生类似“薄包装”的东西。 Sample on wandbox

标签: c++


【解决方案1】:

你可以定义一个命名空间别名:

namespace foo {
    namespace bar {
         namespace something {
             //code
         }
    }
}

namespace alias = foo::bar::something;

现在您可以使用alias 代替foo::bar::something

所以在你的情况下,只需添加这个:

namespace android {
    namespace CameraParameters = hardware::camera::common::V1_0::helper::CameraParameters;
}

或者(不确定这是否合法)

namespace android::CameraParameters = android::hardware::camera::common::V1_0::helper::CameraParameters;

编辑:要确保符号指向该类,您可以使用 gcc 别名:

void alias() __attribute__((alias ("toBeAliased")))

或者您可以通过将正确的符号传递给链接器来做到这一点:

--defsym=oldname=newname

【讨论】:

  • 我认为这不会改变外部可见的符号。
  • 我无法使用别名,但命名空间解决方案不起作用。
  • @CozzmyCosmin 你试过--defsym 吗?还是有太多符号需要手动更改
  • 我有 150 个符号。无论如何,我放弃了这个想法,只是决定用另一种方式破解它。
猜你喜欢
  • 1970-01-01
  • 2013-07-15
  • 1970-01-01
  • 2022-12-15
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多