【问题标题】:SWIG and C++ shared librarySWIG 和 C++ 共享库
【发布时间】:2012-04-24 23:21:56
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ python linker g++ swig


    【解决方案1】:

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

    头文件:

    (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 接口:

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

    编译 Python 模块:

    痛饮 -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 模块的本机部分被称为 _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 来确保我们刚刚构建的共享对象位于库路径上。

    【讨论】:

    • 在ubuntu上编译的时候,我发现我只需要-lmylib而不是mylib
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 2021-11-25
    • 2011-10-04
    • 1970-01-01
    • 2017-10-21
    相关资源
    最近更新 更多