2009-11-22 88 views
1

在我最后一个关于Python的问题之一& C++集成我被告知在Windows使用DLL。 (Previous question)Python导入&使用CDLI(与一个Linux .so文件)

这工作确定这样做的:

cl /LD A.cpp B.cpp C.pp

在Windows环境

,设置包括路径提升,cryptopp来源和cryptopp库后。

现在我正在尝试在linux中做同样的事情,创建一个.so文件来通过python2.5上的ctypes导入。 我所做的:

gcc -Wall -Wextra -pedantic A.cpp B.cpp C.cpp /usr/lib/libcryptopp.so -shared -o /test/decoding.so

,并在创建这样的对象确定。如果删除“共享”编译是好的,但在那里停止作为主要(显然;))。当然也有libcryptopp.so。

但是,当我去python并导入“so”文件时,它说该属性没有对象“解密”,“加密”或任何我放在那里。使用dir对象来确认它们不在那里。

外部功能在A.cpp定义为:

int encrypt (params...) 
//.. 
return num; 

int decrypt (params...) 
//.. 
return num; 

使用也尝试:

extern "C" encrypt (params...) 
..... 

谁能告诉我什么,我做错了吗?

在此先感谢!

抹布

+0

你是如何“导入”.so库?使用ctypes? – 2009-11-22 03:59:08

+0

您可以在.so库上使用'nm'实用程序来显示它公开的名称。 – 2009-11-22 04:01:38

+0

'from ctypes import cdll mydll = cdll.LoadLibrary('/ test/decoding。所以') mydll' 纳米犯规表明他们要么 – Ragnagard 2009-11-22 04:07:17

回答

3

C++编译器破坏函数的名称。做你正在尝试做的,你必须有内部

extern "C" {...} 

很难从你的样品究竟你在源文件中必须告诉声明原型。 正如已经提到的人,使用nm工具来查看共享对象中的对象。

不要编译你的对象没有共享。就我所知,Python加载库不支持静态链接的对象。

用g ++编译器编译你的对象,它会链接到标准的C++库,gcc不会。

+0

感谢,好像真正的问题是使用gcc,而不是克+ +,因为它没有蹩脚的事情。把原型与外部“C”和改变编译器做了诡计;) – Ragnagard 2009-11-22 04:50:18

1

只是为了加倍检查一些东西,因为你使用boost。

#include <string> 
#include <boost/python.hpp> 
using namespace std; 

string hello(string s){ 
    return "Hello World!"; 
} 

BOOST_PYTHON_MODULE(pyhello){ 
    using namespace boost::python; 

    def("hello", hello); 
} 
在Python

>>> import pyhello 
>>> print pyhello.hello() 
Hello World! 

只是我的2美分

,对不起,如果这不能帮助你。

+0

不直接使用boost,但我喜欢这个例子,当我有更多的时间将测试它。谢谢! – Ragnagard 2009-11-22 04:51:06

+0

如何编译我的C/C++代码以使其运行? – kalu 2011-07-25 20:50:15

相关问题