Linux下C++通过dlopen使用动态库

 2024-02-23 03:02:53  阅读 0

本文是Linux下提供类导出的C++动态库实现接口的示例。 注意使用函数返回基类指针,因为Linux动态链接库不能像MFC那样直接导出类。 1.介绍如何使用API​​动态加载C++ 函数和类是Unix C++程序员经常遇到的问题。 事实上,情况有时会很复杂,需要一些解释。 这就是编写这个迷你 HOWTO 的原因。 理解本文档的前提是对C/C++语言的API有基本的了解。 这个HOWTO的维护链接是:C++--mini-HOWTO/ 2.问题是有时你想在运行时加载一个库(并使用它的函数)。 这是当你为你的程序编写一些插件或模块架构时。 经常发生。 在 C 中,加载库是一件轻而易举的事(调用 dlsym 就足够了),但在 C++ 中则有点复杂。 动态加载C++库的难度,一部分是因为C++的名字(译者注:也有人将其翻译为“名字破坏”,我觉得还是不翻译为好),另一部分是因为API的实现是在C语言,所以没有提供正确的方法来加载类。 在解释如何加载 C++ 库之前,最好先仔细看看名称。

我建议您检查一下,即使您对此不感兴趣。 因为它可以帮助您了解问题是如何出现的以及如何解决它们。 1.名称 在每个C++程序(或库、目标文件)中,所有非静态(非)函数都以“符号()”的形式出现在二进制文件中。 这些符号是唯一的字符串,用于区分程序、库和目标文件中的每个函数。 在C中,符号名就是函数名:函数的符号名是“”,依此类推。 这可能是因为两个非静态函数的名称必须不同。 C++允许重载(不同的函数具有相同的名称但参数不同),并且具有许多C所没有的特性——例如类、成员函数和异常描述——使得几乎不可能直接使用函数名作为符号名。 为了解决这个问题,C++使用了所谓的名称。 它将函数名与一些信息(例如参数的数量和大小)混合在一起,并将其转换为只有编译器理解的奇怪的符号名称。 例如,后缀 foo 可能看起来像 foo@4%6^,或者符号名称甚至可能不包含“foo”。 问题之一是 C++ 标准(当前为 [])没有定义必须如何解释名称,因此每个编译器都以自己的方式进行解释。

有些编译器甚至在版本之间切换算法(特别是 g++ 2.x 和 3.x)。 即使你弄清楚你的编译器是如何工作的并且可以使用 dlsym 来调用函数,它也可能仅限于你拥有的编译器并且在下一个版本的编译器下无法工作。 3.使用API​​的类的另一个问题是它只支持加载函数。 但在 C++ 中,您可能想要使用库中的类,这需要创建该类的实例,这并不容易做到。 4. 解决方案1.“C” C++ 有一个特定的关键字,用于使用C 声明函数:“C”。 用“C”声明的函数将使用函数名称作为符号名称,就像 C 函数一样。 因此,只有非成员函数可以声明为“C”并且不能重载。 尽管存在这些限制,“C”函数仍然非常有用,因为它们可以像 C 函数一样动态加载。 添加“C”限定符并不意味着函数中不能使用 C++ 代码。 相反,它仍然是一个完整的C++函数,可以使用任何C++特性和各种类型的参数。

标签: 函数 符号 加载

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码