繁体   English   中英

C-共享库-dlopen,dlsym

[英]C - Shared Library - dlopen, dlsym

对于研究主题,我正在使用C ++程序将SQL查询转换为C ++程序。 转换后,将c ++查询源代码编译到共享库中:

g++ -O0 -g3 -fPIC -std=c++0x GeneratedQuery.cpp ../type/Types.cpp -shared -o lib.so

一切正常,并且库正确编译。 在第二个程序中,我尝试实现一个read-eval-print-loop,该循环从用户处获取查询,进行翻译和编译,使用dlopen和dlsym加载共享库,最后执行它。 在查询代码中使用Intel TBB之前,一切正常,但是现在我输入的第二个查询出现了分段错误(第一查询工作正常,但是循环中加载的第二个查询失败)。

来源(read-eval-print-loop): http : //pastebin.com/pWkRN7Dx

示例查询代码: http//pastebin.com/A1pBZC3d

如果我的查询中没有联接,因此查询源代码中出现一个parallel_for,则没有问题。 但是,如果有多个parallel_fors,则输入的第二个查询会出现分段错误(编译成功并且dlopen有效,但dlsym失败)。

这是gdb的输出

0x00007ffff7de394b in ?? () from /lib64/ld-linux-x86-64.so.2
0x00007ffff7de429e in ?? () from /lib64/ld-linux-x86-64.so.2
0x00007ffff7de4523 in ?? () from /lib64/ld-linux-x86-64.so.2
0x00007ffff6cc612a in ?? () from /lib/x86_64-linux-gnu/libc.so.6
0x00007ffff7bd7044 in ?? () from /lib/x86_64-linux-gnu/libdl.so.2
0x00007ffff7de9176 in ?? () from /lib64/ld-linux-x86-64.so.2
0x00007ffff7bd752f in ?? () from /lib/x86_64-linux-gnu/libdl.so.2
0x00007ffff7bd709a in dlsym () from /lib/x86_64-linux-gnu/libdl.so.2
0x000000000041fd58 in main (argc=1, argv=0x7fffffffe1d8) at ../src/tpcc.cpp:141

我真的不明白第二次查询失败了。 我为dlopen尝试了不同的标志,但对任何组合都无效。

希望有人可以帮助我,因为我对共享库没有经验。

问候

尝试更换

extern "C" { void run { ... } }

extern "C" void run { ... }

请参见精美的http://www.isotton.com/devel/docs/C++-dlopen-mini-HOWTO/C++-dlopen-mini-HOWTO.html文章中的说明。

我不确定我说的话是否正确,但是我记得去年有一个类似的问题,我使用包含的库解决了生成.so的问题。 像这样:

g ++ -O0 -g3 -fPIC -std = c ++ 0x GeneratedQuery.cpp ../type/Types.cpp {在此处添加intel内容.a等} -shared -o lib.so

我使用了CMAKE,必须添加到add_library中。

我希望这会有所帮助,即使没有道歉!

它运行了,但我仍然感到困惑:

如果我给每个库文件一个其他名称,如lib..so并加载它,则一切正常。 是否有类似高速缓存的内容可能导致上述行为?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM