gpt4 book ai didi

c++ - 在 C++ 中使用 dlopen() 和 dlsym() 从 .so 库中获取对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:58:16 27 4
gpt4 key购买 nike

我正在尝试在 Linux 下的 Qt 应用程序中加载一个 .so 文件。这是使用 dlopen() 和 dlsym() 来实现基本功能。但我需要从 .so 库中获取多个字符串列表,因此我尝试对两者使用一个通用的 .h 文件,但我无法从主应用程序访问该对象。

这是我目前所拥有的:

extmodule.h

    #include <list>
#include <string>

using namespace std;

class ExtModule
{
public:
ExtModule();

list<string> L2MACSource;
list<string> L2MACDest;
...

模块文件.cpp

#include "extmodule.h"
extern "C" ExtModule getCont() {
ExtModule modul;
modul.L2MACSource.push_back("...")
return modul;
}
extern "C" void hello()
{
cout << "hello" << endl;
}

main.cpp

#include "extmodule.h"
...
dlopen("...../modulefile.so", RTLD_LAZY);
...
typedef ExtModule(*loadedFunc)();
loadedFunc ext_get = (loadedFunc)dlsym(ext_mod, "getCont");

typedef void (*hello_t)();
hello_t hello = (hello_t)dlsym(ext_mod, "hello");

hello();
ExtModule modul = ext_get();

hello() 函数完美运行,但我无法让 ext_get() 运行(/external.so: undefined symbol :_ZN9ExtModuleC1Ev)。我必须从 .so 库中检索多个列表,但我不知道这是否是正确的方法。另外,正如您可能已经猜到的那样,我并不是特别熟练的程序员。任何建议将不胜感激。

感谢您的帮助。

最佳答案

您可能需要使用 -rdynamic 标志编译和链接您的主程序(要求链接器发出动态符号,以便插件可以看到主程序的名称)例如

 g++ -Wall -rdynamic -g main.cpp -o mainprog

也许上面缺少一些库和附加标志,例如对于 Qt

和你的插件

 g++ -Wall -shared -g -fPIC modulefile.cpp -o module.so

也许上面还缺少其他标志,例如对于 Qt

在实践中,Qt 知道 plugins qmake 也有插件支持。

如果使用 dlopendlsym,您总是应该检查错误:

 ext_mod = dlopen("...../modulefile.so", RTLD_LAZY);
if (!ext_mod) {
fprintf(stderr, "dlopen failure: %s\n", dlerror());
exit (EXIT_FAILURE); }

还有

 hello_t hello = (hello_t)dlsym(ext_mod, "hello");
if (!hello) {
fprintf(stderr, "dlsym failure: %s\n", dlerror());
exit (EXIT_FAILURE); }

阅读dlopen(3) , Program Library HowTo , C++ dlopen mini howto , Drepper 的论文:How To write Shared Libraries , Advanced Linux Programming书。

顺便说一句,您没有显示所有的 C++ 代码。请确保您具有所需的构造函数和析构函数。了解 rule of three (对于旧的 C++03)在 C++11 中成为五的规则.

关于c++ - 在 C++ 中使用 dlopen() 和 dlsym() 从 .so 库中获取对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23454847/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com