【问题标题】:Using .so file without header file使用没有头文件的 .so 文件
【发布时间】:2017-04-22 11:54:59
【问题描述】:

我有一个 .so 文件,我需要在我的 c++ 代码中使用该方法。没有头文件。我通过nm反编译了必要的符号,发现方法和类信息如下。

00000000002ec9c0 B CFTDOrderField::m_Describe
0000000000067440 W CFTDOrderField::DescribeMembers()

经过我的研究,我认为我应该使用动态加载解决方案。但是我不知道如何定义 dlsym 的返回类型,谁能给我一些提示或解决方案?谢谢!!

【问题讨论】:

  • dlopen/dlsym 与“正常”链接相比没有优势;他们也不会替换丢失的头文件,你必须重新创建——这并不容易。也可能违反版权法。

标签: symbols dynamic-linking dynamic-loading nm .so


【解决方案1】:

这不是一项简单的任务。一般来说,你不能在这里简单地使用dlsym。与 C 不同,C++ 会修改符号名称,修改标准可能因实现而异,甚至因同一编译器的版本而异。您仍然可以使用按照 C 约定导出的函数,但恐怕没有标头就无法使用整个类型(C++ 类)。

延迟加载和使用共享对象导出类在 C++ 中总是相当棘手。您可以使用this 教程中的特殊功能,或者您可以使用更高级的技术,例如factories,最后,您可以依赖您的编译器/链接器(所有流行的现代编译器都支持这一点),但无论哪种方式,您都需要一些信息关于您将在程序中使用的类型,并且此信息应在编译时可用。此信息包含在头文件中。所以,你的问题的答案是否定的。

关于名称修改及其“邪恶”的原因,请参见 cmets 中的链接。 (不要太从字面上理解——这是有技术原因的,即使这个功能有时会让生活变得更难:-))

【讨论】:

  • 嗨,@rfx,我不明白你的意思。你能帮忙解释更多细节吗?
  • 对不起。 geeksforgeeks.org/extern-c-in-c 这可能会有所启发,让您了解我在说什么,以及为什么在用 C++ 编写的共享对象上使用 dlopen 很棘手。您可能会发现这篇文章也很有帮助en.wikipedia.org/wiki/Name_mangling
猜你喜欢
  • 1970-01-01
  • 2017-11-14
  • 1970-01-01
  • 2020-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多