C-共享库-dlopen,dlsym >对于一个研究课题,我使用C++程序将SQL查询转换成C++程序。翻译后,C++查询源代码被编译成共享库: g++ -O0 -g3 -fPIC -std=c++0x GeneratedQuery.cpp ../type/Types.cpp -shared -o lib.so

C-共享库-dlopen,dlsym >对于一个研究课题,我使用C++程序将SQL查询转换成C++程序。翻译后,C++查询源代码被编译成共享库: g++ -O0 -g3 -fPIC -std=c++0x GeneratedQuery.cpp ../type/Types.cpp -shared -o lib.so,c++,shared-libraries,dlopen,dlsym,C++,Shared Libraries,Dlopen,Dlsym,一切正常,库编译正确。在第二个程序中,我尝试实现一个read-eval-print循环,该循环接受用户的查询,翻译并编译它,用dlopen和dlsym加载共享库,最后执行它。在我在查询代码中使用Intel TBB之前,一切正常,但现在我输入的第二个查询出现分段错误(第一个查询工作正常,但在循环中加载的第二个查询失败) 来源(读取评估打印循环): 示例查询代码: 如果我的查询中没有连接,因此在查询源代码中出现了一个并行_,那么就没有问题。但是如果有多个并行查询,我输入的第二个查询就会出现分段错误(

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

来源(读取评估打印循环):

示例查询代码:

如果我的查询中没有连接,因此在查询源代码中出现了一个并行_,那么就没有问题。但是如果有多个并行查询,我输入的第二个查询就会出现分段错误(编译成功,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 { ... } }


请参阅伟大论文中的解释。

我不确定我所说的是否正确,但我记得去年有一个类似的问题,我解决了它,生成了。因此,包括了库。大概是这样的:

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

我使用了CMAKE,我必须添加到库中的内容


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

我不确定我所说的是否正确,但我记得去年有一个类似的问题,我解决了它,生成了。所以包括了库。大概是这样的:

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

我使用了CMAKE,我必须添加到库中的内容


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

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


如果我给每个库文件另起一个名字,比如lib..so并加载它,一切都会正常工作。是否有类似缓存的东西会导致上述行为?

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


如果我给每个库文件另起一个名字,比如lib..so并加载它,一切都会正常工作。是否有类似缓存的东西,可能导致上述行为?< /P>所以C还是C++?这很重要,因为名称有误。只是猜测-尝试添加-rdynamic标志。看起来动态加载与问题无关。你有没有试过把这两部分静态地联系起来?这将消除一个未知。我应该如何静态链接它们?查询输入到循环程序中,然后将查询转换并编译到共享库中。此共享库现在已动态加载。由于库是在循环中生成的,因此不可能进行静态链接。哪个程序必须使用-rdynamic标志编译?我猜带有查询源代码的共享库?-rdynamic标志没有帮助。我认为这个问题与第二次出现并行循环有关!但我真的不明白。这是C++,对不起!那么C还是C++?这很重要,因为名称有误。只是猜测-尝试添加-rdynamic标志。看起来动态加载与问题无关。你有没有试过把这两部分静态地联系起来?这将消除一个未知。我应该如何静态链接它们?查询输入到循环程序中,然后将查询转换并编译到共享库中。此共享库现在已动态加载。由于库是在循环中生成的,因此不可能进行静态链接。哪个程序必须使用-rdynamic标志编译?我猜带有查询源代码的共享库?-rdynamic标志没有帮助。我认为这个问题与第二次出现并行循环有关!但我真的不明白。这是C++,对不起!你能告诉我更多的细节吗?也许你的例子?你能给我一些进一步的细节吗?也许是你的例子?