对于一个研究主题,我使用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之前,一切正常,但现在我输入的第二个查询出现分段错误(第一个查询工作正常,但加载到循环中的第二个查询失败)。
源(读取-求值-打印-循环):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尝试了不同的标志,但对于任何组合都不起作用。
希望有人能帮助我,因为我在共享库方面非常缺乏经验。
问候
发布于 2014-01-02 22:48:52
尝试替换
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-03 00:11:06
我真的不确定我所说的是否正确,但我记得去年有一个类似的问题,我在生成包含库的.so时解决了这个问题。如下所示:
g++ -O0 -g3 -fPIC -std=c++0x GeneratedQuery.cpp ../type/Types.cpp {在此处添加英特尔内容.a等} -shared -o lib.so
我使用了CMAKE,并且我不得不添加到add_library的东西中。
我希望这会有帮助,如果不是道歉的话!
发布于 2014-01-03 00:56:55
让它运行起来,但我仍然很困惑:
如果我给每个库文件另起一个名字,比如lib..so并加载它,一切都会正常工作。是否有类似缓存的东西可以导致上面描述的行为?
https://stackoverflow.com/questions/20884887
复制相似问题