0

对于一个研究主题,我正在使用 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 之前一切正常,但现在我输入的第二个查询出现分段错误(第一个查询工作正常,但循环中加载的第二个查询失败)。

来源(读取评估打印循环): 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 尝试了不同的标志,但它不适用于任何组合。

希望有人可以帮助我,因为我在共享库方面非常缺乏经验。

问候

4

3 回答 3

3

尝试更换

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

extern "C" void run { ... }

请参阅伟大的http://www.isotton.com/devel/docs/C++-dlopen-mini-HOWTO/C++-dlopen-mini-HOWTO.html论文中的解释。

于 2014-01-02T14:48:51.770 回答
1

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

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

我使用了 CMAKE,我不得不添加到 add_library 的东西。

我希望这会有所帮助,如果不是道歉!

于 2014-01-02T16:11:05.643 回答
0

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

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

于 2014-01-02T16:56:55.303 回答