C++ - 为现有库创建 Pythonwrapper

C++ - Create Pythonwrapper to existing Library

我需要为现有的 C++ 模块编写 python 包装器。首先,我用这个基本示例测试了程序(现在实际上工作正常):

现在我尝试更改设置:我想使用现有的库而不是我的单个 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 

我想 link 使用 -L 命令针对给定库中的两个 .a 文件。我没有收到任何错误,但是当我尝试通过 ipython 导入模块时,我得到了这个:

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

原来的框架里有一个函数"calibration_load",还有一个"camera_type"。但我不知道两者之间的神秘事物从何而来。

抱歉我含糊不清的解释,我试图尽可能地解释它,但 C++ 包装器不是我觉得 "at home".

的主题之一

问题是您没有链接到您在 C++ 代码中使用的外部库;将 -l<library> 添加到您的第二个 g++ 电话。

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

完成任务。感谢您提示我实际上没有 link 库,因为我只使用了 -L 选项。

而且选项的顺序是错误的。我必须在开头声明 "projectionWrapper.o",以及在“-lorigbase”之前声明“-loriginterface”。这是在这里回答的:"undefined reference" when linking against a static library

(库的完整名称是:liboriginterface.a 和 liborigbase.a)