Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Python导入&;使用cdll(使用linux.so文件)_C++_Python_Linux_File_Shared Libraries - Fatal编程技术网

C++ Python导入&;使用cdll(使用linux.so文件)

C++ Python导入&;使用cdll(使用linux.so文件),c++,python,linux,file,shared-libraries,C++,Python,Linux,File,Shared Libraries,在我最后一个关于python和c++集成的问题之后,我被告知在windows上使用DLL。 这样做还行: cl/LD A.cpp B.cpp C.pp 在windows环境中,设置boost、cryptopp源和cryptopp库的包含路径后 现在,我正在尝试在linux中执行同样的操作,创建一个.so文件,通过python2.5上的ctypes导入。 我做到了: gcc-Wall-Wextra-pedantic A.cpp B.cpp C.cpp/usr/lib/libcryptopp.so

在我最后一个关于python和c++集成的问题之后,我被告知在windows上使用DLL。

这样做还行:

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

在windows环境中,设置boost、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

这样就可以创建so对象了。如果删除了“-shared”编译就可以了,但会停止,因为其中没有main(显然;))。当然,libcryptopp.so也存在

但是当我转到python并导入“so”文件时,它说该属性没有对象“decrypt”、“encrypt”或我放在那里的任何东西。在dll对象上使用“dir”可以确认它们不存在

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

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

int decrypt (params...)
//..
return num;
还尝试使用:

extern "C" encrypt (params...)
.....
谁能告诉我我做错了什么

提前谢谢


Rag

C++编译器会损坏函数名。要做你想做的事情,你必须在里面有声明原型

extern "C" {...}
很难从示例中分辨出源文件中的确切内容。 正如前面提到的,使用nm实用程序可以查看共享对象中的对象

不使用-shared编译对象。据我所知,Python加载库不支持静态链接对象


用C++编译器编译对象,将链接到标准C++库,GCC不。要做你想做的事情,你必须在里面有声明原型

extern "C" {...}
很难从示例中分辨出源文件中的确切内容。 正如前面提到的,使用nm实用程序可以查看共享对象中的对象

不使用-shared编译对象。据我所知,Python加载库不支持静态链接对象


用G++编译器编译对象,将链接到标准C++库,GCC不。

< P>只是使用Boosi.

进行双检查。
#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);
}

只有我的2美分,如果这对您没有帮助,很抱歉。

只是为了再次检查一些东西,因为您使用了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);
}

只有我的2美分,如果这对您没有帮助,很抱歉。

您如何尝试“导入”该.so库?使用ctypes?您可以在.so库上使用
nm
实用程序来显示它公开的名称。
从ctypes导入cdll mydll=cdll.LoadLibrary('/test/decoding.so')mydll
nm不显示它们。您如何尝试“导入”该.so库?使用ctypes?您可以在.so库上使用
nm
实用程序来显示它公开的名称。
从ctypes导入cdll mydll=cdll.LoadLibrary('/test/decoding.so')mydll
nm不显示这些名称。看起来真正的问题是使用gcc而不是g++,因为它做了一些糟糕的事情。使用外部“C”放置原型并更改编译器就成功了;)谢谢,看起来真正的问题是使用gcc而不是g++,因为它做了一些糟糕的事情。使用外部“C”放置原型并更改编译器就成功了;)不直接使用boost,但我喜欢这个例子,当我有更多的时间时,我会测试它。谢谢不直接使用boost,但我喜欢这个例子,当我有更多的时间时,我会测试它。谢谢