【问题标题】:Swig with cmake and additional libraries带有 cmake 和其他库的 Swig
【发布时间】:2012-03-20 04:02:33
【问题描述】:

我正在做一个项目,我想在 Python 中使用 C++ 库。经过一些研究后,我发现 Swig 是一个很好的方法(一个小例子有效)。

所以现在我正在尝试将 Swig 包含到 cmake 中以使事情变得更舒适。

就我而言,我有一个非常小的程序来测试:

#include "ct.h"
using namespace std;

int main(int argc, char const *argv[])
{
    /* code */
    return 0;
}

int test()
{
    Image image(10,11);
    cout << "hallo"<< endl;

    return 3;
}

Image 类在头文件“image.h”中定义,该头文件包含在“ct.h”中。这可能是这里的问题,因为包含 Image 类的库需要链接到由 Swig 生成的库。 我不确定这...而且,特别是,我不知道该怎么做。我无法在手册中找到任何内容。

无论如何,如果我想在 python 中包含该库,我会收到以下错误:

>>> import kissCT
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "kissCT.py", line 25, in <module>
    _kissCT = swig_import_helper()
  File "kissCT.py", line 21, in swig_import_helper
    _mod = imp.load_module('_kissCT', fp, pathname, description)
ImportError: ./_kissCT.so: undefined symbol: _ZN5ImageC1Eii

相关的 Swig 文件如下所示:

/* kissCT test module */

%module kissCT
%{
#import "ct.h"
extern int test();
%}
extern int test();

我希望这一切都不会令人困惑,如果有人知道我做错了什么,我将不胜感激。

编辑:相关的 cmake 文件看起来像 this

【问题讨论】:

    标签: c++ python cmake swig


    【解决方案1】:

    Python 需要能够在运行时找到图像库。最简单的方法是将 LD_LIBRARY_PATH 环境变量设置为包含未定义符号的图像 .so 文件的文件夹。

    如果您运行命令“ldd _kissCT.so”,它应该会显示它所依赖的库。

    【讨论】:

    • 非常感谢您的回答。我在 .bashrc 文件中设置了 LD_LIBRARY_PATH 变量并尝试再次运行它。不幸的是,我遇到了同样的错误。此外,令人惊讶的是,ldd 没有列出其中缺少定义的库。
    • 构建时需要将_kissCT.so与图片库链接
    • 嗯,这就是我之前描述的问题(请阅读上文)。如何在 cmake 中做到这一点?
    • 也许将图像库添加到 SWIG_LINK_LIBRARIES ?恐怕我对 cmake 不太熟悉。
    • 是的,这正是我们所缺少的。我将缺少的库添加到 SWIG_LINK_LIBRARIES 并且它有效。非常感谢。
    【解决方案2】:

    实际上,由于未解析的符号已被 C++ 损坏,这表明缺少以下链接器选项:

    -lstdc++
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-13
      • 1970-01-01
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多