从 R 调用时,C++ 程序不会运行(符号查找错误)

Posted

技术标签:

【中文标题】从 R 调用时,C++ 程序不会运行(符号查找错误)【英文标题】:C++ Program Won't Run When Invoked From R (Symbol Lookup Error) 【发布时间】:2019-09-19 15:29:42 【问题描述】:

我有一个 c++ 程序 Alpine3d,当我从命令行调用它时它运行良好。该程序使用 MongoCXX 将数据输出到 MongoDB。

在一台 Ubuntu 18 PC 上,我可以使用“system”命令从 R 成功运行 Alpine3d。但是,在 Alpine3D 从命令行正确运行的另一台 Ubuntu 18 PC 上,尝试从 R 运行 Alpine3D 会引发错误:

alpine3d: symbol lookup error: /usr/local/lib/libmongocxx.so._noabi: undefined symbol: mongoc_transaction_opts_destroy

这个库,/usr/local/lib/libmongocxx.so._noabi,存在。我怀疑可能是 MongoCXX 安装不正确,但重新安装后我不这么认为。

基于此线程Error while loading shared libraries: libbsoncxx.so._noabi: cannot open shared object file: No such file or directory,我还使用了 CMakeLists.txt 以确保 Mongo 和 BSON 库已正确链接,并且看起来它们已成功获取。

有什么想法可以调查吗?如果有人知道从哪里开始,很高兴展示一些代码。

感谢您的任何想法!

[更新]回应拉尔夫的评论:

ldd $(which alpine3d)在命令行的输出是:

$ ldd $(which alpine3d)
    linux-vdso.so.1 (0x00007ffc097aa000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f15a5675000)
    libbsoncxx.so._noabi => /usr/local/lib/libbsoncxx.so._noabi (0x00007f15a5458000)
    libmongocxx.so._noabi => /usr/local/lib/libmongocxx.so._noabi (0x00007f15a51cb000)
    libalpine3d.so.3 => /usr/local/lib/libalpine3d.so.3 (0x00007f15a4f39000)
    libmeteoio.so.2 => /usr/local/lib/libmeteoio.so.2 (0x00007f15a4b0f000)
    libsnowpack.so.3 => /usr/local/lib/libsnowpack.so.3 (0x00007f15a480a000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f15a4481000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f15a40e3000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f15a3ecb000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f15a5c7f000)
    libbson-1.0.so.0 => /usr/local/lib/libbson-1.0.so.0 (0x00007f15a3c91000)
    libmongoc-1.0.so.0 => /usr/local/lib/libmongoc-1.0.so.0 (0x00007f15a3a06000)
    libgomp.so.1 => /usr/lib/x86_64-linux-gnu/libgomp.so.1 (0x00007f15a37d7000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f15a35b8000)
    libproj.so.12 => /usr/lib/x86_64-linux-gnu/libproj.so.12 (0x00007f15a334f000)
    liblapack.so.3 => /usr/lib/x86_64-linux-gnu/liblapack.so.3 (0x00007f15a2ac9000)
    libblas.so.3 => /usr/lib/x86_64-linux-gnu/libblas.so.3 (0x00007f15a286e000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f15a2666000)
    libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f15a244b000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f15a222e000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f15a202a000)
    libopenblas.so.0 => /usr/lib/x86_64-linux-gnu/libopenblas.so.0 (0x00007f159fd84000)
    libgfortran.so.4 => /usr/lib/x86_64-linux-gnu/libgfortran.so.4 (0x00007f159f9a5000)
    libquadmath.so.0 => /usr/lib/x86_64-linux-gnu/libquadmath.so.0 (0x00007f159f765000)

其中显示了指向 libmongocxx 等的链接。

来自 R:

system("ldd $(which alpine3d)")
    linux-vdso.so.1 (0x00007ffe0d5f2000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1fa84e4000)
    libbsoncxx.so._noabi => /usr/local/lib/libbsoncxx.so._noabi (0x00007f1fa82c7000)
    libmongocxx.so._noabi => /usr/local/lib/libmongocxx.so._noabi (0x00007f1fa803a000)
    libalpine3d.so.3 => /usr/local/lib/libalpine3d.so.3 (0x00007f1fa7da8000)
    libmeteoio.so.2 => /usr/local/lib/libmeteoio.so.2 (0x00007f1fa797e000)
    libsnowpack.so.3 => /usr/local/lib/libsnowpack.so.3 (0x00007f1fa7679000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f1fa72f0000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f1fa6f52000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f1fa6d3a000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f1fa8aee000)
    libbson-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libbson-1.0.so.0 (0x00007f1fa6b03000)
    libmongoc-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libmongoc-1.0.so.0 (0x00007f1fa6890000)
    libgomp.so.1 => /usr/lib/x86_64-linux-gnu/libgomp.so.1 (0x00007f1fa6661000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f1fa6442000)
    libproj.so.12 => /usr/lib/x86_64-linux-gnu/libproj.so.12 (0x00007f1fa61d9000)
    liblapack.so.3 => /usr/lib/x86_64-linux-gnu/liblapack.so.3 (0x00007f1fa5953000)
    libblas.so.3 => /usr/lib/x86_64-linux-gnu/libblas.so.3 (0x00007f1fa56f8000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f1fa54f0000)
    libssl.so.1.1 => /usr/lib/x86_64-linux-gnu/libssl.so.1.1 (0x00007f1fa5263000)
    libcrypto.so.1.1 => /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 (0x00007f1fa4d98000)
    libsnappy.so.1 => /usr/lib/x86_64-linux-gnu/libsnappy.so.1 (0x00007f1fa4b90000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f1fa4973000)
    libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f1fa4758000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f1fa4554000)
    libopenblas.so.0 => /usr/lib/x86_64-linux-gnu/libopenblas.so.0 (0x00007f1fa22ae000)
    libgfortran.so.4 => /usr/lib/x86_64-linux-gnu/libgfortran.so.4 (0x00007f1fa1ecf000)
    libquadmath.so.0 => /usr/lib/x86_64-linux-gnu/libquadmath.so.0 (0x00007f1fa1c8f000)

我现在可以看到文件夹不同了。 R从哪里得到这个变量是不同的?再次感谢!

【问题讨论】:

ldd $(which alpine3d)ldd /usr/local/lib/libmongocxx.so._noabi 在命令行和 R 中使用 system() 的输出是什么? 仔细观察,这些值似乎确实不同。 为什么必须安装libmongoclibbson 的版本? R 的启动脚本将LD_LIBRARY_PATH 变量更改为包括/usr/lib/x86_64-linux-gnu/,c.f. RHOME/etc/ldpaths。这可能导致strange problems。也许尝试将/usr/local/lib 添加到LD_LIBRARY_PATH 我是否应该将 libmongoc 和 libbson 安装到 /usr/lib/x86_64-linux-gnu/ 而不是 /usr/local/lib?我认为我不需要安装到后一个文件夹,并且此错误可能是尝试安装 mongocxx 库的失败尝试的副产品。 /usr/lib/x86_64-linux-gnu 中的库通过包管理器安装在哪里?在这种情况下,我会(尝试)删除包。如果没有,我会从这些目录中删除这些库,因为我仅将 /usr/lib/x86_64-linux-gnu 用于通过包管理器安装的东西。 【参考方案1】:

感谢 Ralf 的 cmets,我明白了这一点。我必须从命令行和从源代码构建安装 libmongoc。要卸载 /usr/lib/x86_64-linux-gnu 中的版本,我只需使用命令行:

sudo apt-get remove libmongoc-1.0-0

【讨论】:

以上是关于从 R 调用时,C++ 程序不会运行(符号查找错误)的主要内容,如果未能解决你的问题,请参考以下文章

从堆栈跟踪中查找共享库中的源代码行

尝试从 C++/CLI 调用非托管 C++ 时解决错误

如何解决运行时符号查找错误?

混合 C 和 C++ 时继续出现 LNK2019 错误

使用 MatLab dll 时出现 C++ 错误:找到一个或多个多重定义符号

从 Mono 上运行的 C# 进程运行 C++ 应用程序。运行检测器错误