【问题标题】:How to bind Python to C++ code that includes Jsoncpp?如何将 Python 绑定到包含 Jsoncpp 的 C++ 代码?
【发布时间】: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 (及相关)无关。

标签: c++ gcc linker jsoncpp


【解决方案1】:

好吧,看起来解决方案是在编译共享 .so 文件时还包含 -ljsoncpp 标志:

 $(CC) -shared -o testcode.so testcode.o -ljsoncpp

【讨论】:

    猜你喜欢
    • 2020-05-17
    • 1970-01-01
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2010-09-18
    相关资源
    最近更新 更多