对于研究主题,我使用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加载共享库,最后执行它。在查询代码中使用英特尔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尝试了不同的标志,但它不能用于任何组合。
希望有人可以帮助我,因为我对共享库非常缺乏经验。
此致
答案 0 :(得分:3)
尝试替换
extern "C" { void run { ... } }
到
extern "C" void run { ... }
参见伟大的http://www.isotton.com/devel/docs/C++-dlopen-mini-HOWTO/C++-dlopen-mini-HOWTO.html论文中的解释。
答案 1 :(得分:1)
我不确定我所说的是否正确,但我记得去年有一个类比问题我解决了它生成包含库的.so。像这样:
g ++ -O0 -g3 -fPIC -std = c ++ 0x GeneratedQuery.cpp ../type/Types.cpp {add intel stuff here .a etc} -shared -o lib.so
我使用了CMAKE,我不得不添加add_library内容。
我希望这有帮助,如果不是道歉!。
答案 2 :(得分:0)
让它运行,但我仍然感到困惑:
如果我给每个库文件另一个名字,比如lib..so并加载它,一切正常。是否有类似缓存的内容可能导致上述行为?