对于一个研究主题,我正在使用 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 尝试了不同的标志,但它不适用于任何组合。
希望有人可以帮助我,因为我在共享库方面非常缺乏经验。
问候