如何将 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++ 代码?的主要内容,如果未能解决你的问题,请参考以下文章

如何在安卓ndk工程中引入jsoncpp

如何链接jsoncpp?

Json---使用Jsoncpp解析与写入

jsoncpp的使用

将它们添加到 C++ 中 JsonCpp 模块中的数组后的错误值

Jsoncpp库增加到VS2019