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

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

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

这是正确的方法/想法吗?编译和链接命令的外观如何(当然不完全是)?我正在尝试生成Python绑定。

参考方案

我为您整理了一个完整的示例:
头文件:
(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-共享的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)
linux2上的[GCC 4.6.2]
键入“帮助”,“版权”,“信用”或“许可证”以获取更多信息。
>>>导入mylib
>>> i = mylib.Foo()
>>> mylib.bar(i)
0x28cc100
>>> mylib.bar(i)
0x28cc100
>>> mylib.bar(mylib.Foo())
0x28b3b10

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

在Java中,执行“ ++++++++”表达式,编译器未报告任何错误并且可以正确执行? - java

我用eclipse编写了这段代码,用war写过,结果为3d。public static void main(String[] args) { double a = 5d + + + + + +-+3d; System.out.println(a); } 参考方案 您的表情可以改写为(5d) + (+ + + + +-+3d) 其中第一个+是应用于两个操作数的…

在Python和C++之间传输数据而无需写入Windows和Unix文件 - python

我有预先存在的python和C ++文件,其中python文件定义了许多点,而C ++代码利用其现有库进行了所需的计算。最终产品是C ++代码写入的文件。我正在寻找一种在python中获取2000点列表的方法,将其传递给函数,然后执行所有C ++代码并输出我需要的文件。其他注意事项。这必须是可以在Linux或Windows机器上工作的东西,并且最少安装新插件…

Java值加变量++ - java

考虑以下代码int val1 = 3; val1++; int val2 = val1++; System.out.println(val1); System.out.println(val2); Val1值= 5;Val2值= 4;为什么Val1的值是“ 5”?据我了解,应该为4,因为:在第1行,它的赋值为3,在第2行,通过val1 ++加上1,结果val…

我可以使用JNI在Java代码中引用C++对象吗? - java

我在任何地方都没有看到(或者也许我很简单,没有看到它),但是有没有办法使用JNI返回c / c ++对象并在Java中使用该对象?例如(非常简单):class simpleClass{ ... private: int intVar; public: int getIntVar(); void setIntVar(int someNum); ... } 在我…

如何锁定终端运行的perl,obj c,c++,python和ruby等脚本的源代码? - python

我想出售我在perl,obj c,c ++,python,ruby,bash,php等中制作的脚本等它们都在终端中运行。 (Linux)如何锁定源代码,以便无需人们访问源代码即可分发我的脚本..?换句话说,如何将在Terminal中运行的程序的源代码锁定,以便人们可以使用该程序(如果该代码已下载到他们的Linux机器上,但他们无法访问实际的源代码)?例:ex…