为现有库创建Pythonwrapper

C++ - Create Pythonwrapper to existing Library

本文关键字:创建 Pythonwrapper      更新时间:2023-10-16

我需要为现有的c++模块编写一个python包装器。首先,我用这个基本示例测试了这个过程(现在它实际上工作得很好):c++ - Python绑定ctypes -在函数

中返回多个值

现在我尝试更改设置:我想使用现有的库而不是我的单个cpp文件。我试着这样做:

g++ -c -I. -fPIC projectionWrapper.cpp -o projectionWrapper.o
g++ -shared -Wl,-soname,libproj.so 
    -L./build/liborig_interface.a,./build/liborig_base.a 
    -o libproj.so  projectionWrapper.o 

我想用-L命令链接给定库中的两个。a文件。我没有得到任何错误,但当我试图通过ippython导入模块时,我得到这个:

import myprojection    # I load libproj.so in this python file
OSError: ./libproj.so: undefined symbol: _Z29calibration_loadPKcjbP14camera_typetS2_

在原始框架中有一个"calibration_load"函数,以及一个"camera_type"函数。但我不知道中间那些神秘的东西是从哪里来的。

为我的模糊解释感到抱歉,我试图尽可能地解释它,但是c++包装器不是我觉得"自在"的主题之一。

问题是你没有链接到你在c++代码中使用的外部库;将-l<library>添加到第二个g++呼叫中

g++ -shared projectionWrapper.o 
    -L./build/base -L./build/interface
    -loriginterface -lorigbase 
    -Wl,-soname,libproj.so  
    -o libproj.so

完成了任务。谢谢你的提示,我实际上没有链接库,因为我只使用了-L选项。

而且选项的顺序是错误的。我必须声明"projectionWrapper"。开头的"O",以及"-lorigbase"之前的"-loriginterface"。这里回答了这个问题:"未定义的引用"。当链接到静态库

(库的全称是:liboriginterface)。A and liborigbase.a)