在共享C++ C++中加载C++共享库时未定义的符号,它本身由Python加载

2024-05-26 11:10:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在研究ESPResSo++(http://www.espresso-pp.de/)中的一段新代码,这是一个分子动力学(MD)模拟包。代码将ESPResSo++与PLUMED(https://plumed.github.io/)连接起来,这是一个MD包的插件。ESPResSo++广泛使用了boost python库。Python代码加载一个共享C++库来完成大部分计算,同时提供一个用户界面。从意大利浓咖啡C++的共享C++库中调用羽毛库。PLUMED可以静态地链接到ESPResSo++,也可以动态地链接到运行时。当PLUMED静态连接时,我没有问题。当使用PLUMED的运行时链接构建ESPResSo++时,会出现未定义的符号错误:

+++ Loading the PLUMED kernel runtime +++
+++ PLUMED_KERNEL="/home/theorie/songbin/applications/src/plumed-2.4.0/src/lib/libplumedKernel.so" +++
+++ PLUMED kernel not found ! +++
+++ error message from dlopen(): /home/theorie/songbin/applications/src/plumed-2.4.0/src/lib/libplumedKernel.so: undefined symbol: plumed_cmd
+++ ERROR: you are trying to use plumed, but it is not available +++
+++ Check your PLUMED_KERNEL environment variable +++

一。我跑了

^{pr2}$

一。输出包括:

undefined symbol: plumed_cmd    (./libplumedKernel.so)
undefined symbol: plumed_kernel_register    (./libplumedKernel.so)
undefined symbol: plumed_finalize   (./libplumedKernel.so)
undefined symbol: plumed_create (./libplumedKernel.so)

一。然后我跑了

nm _espressopp.so | grep plumed

一。我得到了

000000000275b8a0 T plumed_c2f
000000000275b660 T plumed_cmd
000000000275b5d0 T plumed_create
000000000275b450 T plumed_dummy_cmd
000000000275b430 T plumed_dummy_create
000000000275b440 T plumed_dummy_finalize
000000000275b900 T plumed_f2c
000000000275ba30 T plumed_f_cmd
000000000275bc20 T plumed_f_cmd_
000000000275bc30 T plumed_f_cmd__
000000000275ba10 T plumed_f_create
000000000275bbd0 T plumed_f_create_
000000000275bbe0 T plumed_f_create__
000000000275ba60 T plumed_f_finalize
000000000275bc70 T plumed_f_finalize_
000000000275bc80 T plumed_f_finalize__
000000000275b9f0 T plumed_f_gcmd
000000000275bae0 T plumed_f_gcmd_
000000000275baf0 T plumed_f_gcmd__
000000000275b9e0 T plumed_f_gcreate
000000000275ba90 T plumed_f_gcreate_
000000000275baa0 T plumed_f_gcreate__
000000000275ba00 T plumed_f_gfinalize
000000000275bb30 T plumed_f_gfinalize_
000000000275bb40 T plumed_f_gfinalize__
000000000275b9a0 T plumed_f_ginitialized
000000000275bb80 T plumed_f_ginitialized_
000000000275bb90 T plumed_f_ginitialized__
000000000275ba80 T plumed_f_global
000000000275bd10 T plumed_f_global_
000000000275bd20 T plumed_f_global__
000000000275b700 T plumed_finalize
000000000275b960 T plumed_f_installed
000000000275bcc0 T plumed_f_installed_
000000000275bcd0 T plumed_f_installed__
000000000275b800 T plumed_gcmd
000000000275b7c0 T plumed_gcreate
000000000275b840 T plumed_gfinalize
000000000275b890 T plumed_ginitialized
000000000275b7b0 T plumed_global
000000000275b790 T plumed_installed
000000000275b4a0 T plumed_kernel_register

我不明白为什么会出错。“羽状命令”和其他定义见_浓缩咖啡,但装载时找不到libplumedKernel.so. 如果有人能帮忙解决这个问题,我将不胜感激。在

更新1 我找到了这个页面(http://grokbase.com/t/python/python-list/071afrstds/dynamic-library-loading-missing-symbols),并了解到我可以设置LD\u DEBUG=all来查找执行过程中的符号搜索。与网页中类似_浓缩咖啡没有搜索符号。这是因为dlopen在导入时使用RTLD\u NOW作为标志_浓缩咖啡. 该页面建议使用RTLD\u GLOBAL作为标志。不幸的是,它导致其他地方的进口失败。我现在不能集中讨论这个问题,代码使用静态或动态链接,而不是运行时链接。Plumed确实有一个接口,我认为可以用Boost/Python包装它来实现运行时链接。但这并不是我的首要任务。如果有人有建议,请在下面留言。谢谢您。在


Tags: 代码srccmdso链接createsymbolkernel
1条回答
网友
1楼 · 发布于 2024-05-26 11:10:34

这个问题已经通过改变上游的代码来解决。更改的详细信息:https://github.com/plumed/plumed2/pull/362。简而言之,PLUMED不再依赖dlopen来搜索库。相反,它使用dlsym查找全局不可见的符号。在

相关问题 更多 >