c++ - SWIG 和 C++ 共享库

标签 c++ python linker g++ swig

我有一个 C++ 库(我们称之为 mylib),它编译为 /usr/local/lib 中的 libmylib.so 文件,并且我在 /usr/local/include 中名为 my lib 的目录中有一堆头文件。

现在我想做的事情(对于初学者)只是使用 SWIG 的一个头文件(它包含有关我的库提供的类的信息)来生成 mylib_wrap.cxx 文件然后编译它并将其链接到现有的 mylib.so。这样我就可以在 Python 中实例化我的类。

这是正确的方法/想法吗?编译和链接命令会是什么样子(当然不完全是)?我正在尝试生成 Python 绑定(bind)。

最佳答案

我为你整理了一个完整的例子:

头文件:

(mylib.h)

class Foo {
};

void bar(const Foo&);

实现:

#include "mylib.h"
#include <iostream>

void bar(const Foo& f) {
  std::cout << &f << std::endl;
}

编译库:

g++ -fPIC -Wall -Wextra -shared mylib.cc -o libmylib.so

SWIG interface to wrap the library:

%module mylib

// Make mylib_wrap.cxx include this header:
%{
#include "mylib.h"
%}

// Make SWIG look into this header:
%include "mylib.h"

编译 Python 模块:

swig -Wall -c++ -python mylib.i
g++ -fPIC -Wall -Wextra -shared mylib_wrap.cxx -o _mylib.so -L。 -lmylib -I/usr/include/python2.7/-lpython2.7

请注意,我们将 Python 模块与库相关联。如果它不在当前目录中,则需要指定库路径。 SWIG 期望 Python 模块的 native 部分被称为 _module.so

运行

LD_LIBRARY_PATH=。 Python
Python 2.7.2+(默认,2011 年 11 月 30 日,19:22:03)
[GCC 4.6.2] 在 linux2 上
输入“帮助”、“版权”、“信用”或“许可”以获取更多信息。
>>> 导入 mylib
>>> i=mylib.Foo()
>>> mylib.bar(i)
0x28cc100
>>> mylib.bar(i)
0x28cc100
>>> mylib.bar(mylib.Foo())
0x28b3b10

这里我通过适当设置 LD_LIBRARY_PATH 来确保我们刚刚构建的共享对象位于库路径上。

关于c++ - SWIG 和 C++ 共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10126531/

相关文章:

c++ - C++ constexpr函数来测试预处理器宏

android - Python 计算机到 Android 手机

visual-studio - 如何在 Visual Studio 中静态链接 VCPKG 生成的 .lib 文件

c - 如何不对所有链接库使用 -wrap?

c# - C++ 和 C# 数组和 Void 转换

c++ - Directx9 索引缓冲区和多流

python - 在 Python Pandas 中,如何获取一列,然后跳过几列,然后获取连续的列

python - 在 Python 中交互运行外部可执行文件

c++ - 从VS2010链接到ARPACK

c++ - Visual Studio发行模式exe文件是否独立?