如何将 Python 绑定到包含 Jsoncpp 的 C++ 代码?
Posted
技术标签:
【中文标题】如何将 Python 绑定到包含 Jsoncpp 的 C++ 代码?【英文标题】:How to bind Python to C++ code that includes Jsoncpp? 【发布时间】:2020-04-22 15:00:06 【问题描述】:使用标准的ctypes.CDLL
方法,处理使Python 能够通过Python 的ctypes
模块调用编译成共享库文件(.so
文件)的代码的代码。 C++ 代码执行数值计算,Python 代码主要用作控制器并执行数据分析。一切正常。但是,一旦我在 C++ 代码中包含 jsoncpp
库,Python 就开始抱怨未定义的符号错误,例如 undefined symbol: _ZN4Json5ValueaSES0_
等。我在 C++ 中使用 jsoncpp
库主要是为了将数据导出到 JSON 文件。在网上搜索了一段时间,似乎没有太多讨论这个问题。知道如何处理吗?
【问题讨论】:
如何编译C++代码? 带有 -ljsoncpp 标志。 C++ 代码编译成功并提供所需的 JSON 文件。我一从 Python 调用它,就发生了错误。 您使用的是什么平台和编译器? 它在 Ubuntu 16.04 上。CC=g++
CFLAGS=-I. -std=c++11
$(CC) -c -Wall -fPIC -ljsoncpp testcode.cpp -o testcode.o $(CFLAGS)
$(CC) -shared -o testcode.so testcode.o
。 g++ 的版本是5.4.0 20160609
。 Python 版本为 3.7,.so
文件通过ctypes.CDLL("./testcode.so")
调用 Python。当 C++ 不使用 Jsoncpp 时,Python 调用正常执行。 (抱歉,无法在评论中格式化代码)。
-ljsoncpp
是一个链接器标志,因此在第二个命令中是必需的(如果存在,它在第一个命令中被忽略)。无论如何,这个问题与 Python (及相关)无关。
【参考方案1】:
好吧,看起来解决方案是在编译共享 .so
文件时还包含 -ljsoncpp
标志:
$(CC) -shared -o testcode.so testcode.o -ljsoncpp
【讨论】:
以上是关于如何将 Python 绑定到包含 Jsoncpp 的 C++ 代码?的主要内容,如果未能解决你的问题,请参考以下文章