【问题标题】:Python and C++ integration.Problems with dynamic libraryPython 和 C++ 集成。动态库的问题
【发布时间】:2019-07-10 09:21:03
【问题描述】:

我使用 Swig。(Mac os 10.13)

我的 shell 脚本:

swig -c++ -python -o example_wrap.cpp example.i

g++ -c -std=c++17  -fPIC example.cpp

g++ -c -std=c++17  -fPIC example_wrap.cpp -o example_wrap.o \
-I/usr/local/Cellar//python/3.7.2_2/Frameworks/Python.framework/Versions/3.7/include/python3.7m

ld -bundle -macosx_version_min 10.13 -flat_namespace \
-undefined suppress -o _example.so *.o

我花了足够的时间寻找如何为 Python 创建 C++ 动态库,但我从未使用过最后一行。大多数情况下,我从 IDE 创建库。 g++ -shared 比较熟悉,但是不行。 出现很多这样的错误:

Undefined symbols for architecture x86_64:
  "_PyArg_ParseTuple", referenced from:
      _wrap_printTree(_object*, _object*) in example_wrap.o

我从 Python.h 中了解了这些方法。 所以,问题是 - 最后一行是如何工作的(ld -bundle ...)?还有其他方法可以创建动态库吗?如何使用g++ -shared

【问题讨论】:

  • 我不想手动调用链接器,这容易出错且复杂。也许改用cmake,它对swig绑定有很好的支持。此外,您需要链接到 python 库,例如-lpython3.7 或类似的东西。
  • 我知道cmake。这可能没有意义,但我想了解如果我手动创建它是如何工作的。
  • @lubgr,如果你知道关于 cmake + swig 的好消息,可以发一下吗没有例子:(

标签: python c++ dynamic-library language-interoperability


【解决方案1】:

这是一个小的CMakeLists.txt,应该适用于您发布的示例:

cmake_minimum_required(VERSION 3.10) # change this to your needs

project(foo VERSION 0.0 LANGUAGES CXX C)

find_package(SWIG REQUIRED)
include(${SWIG_USE_FILE})

find_package(PythonLibs)

include_directories(${PYTHON_INCLUDE_PATH})
include_directories(${CMAKE_CURRENT_SOURCE_DIR})

set(CMAKE_SWIG_FLAGS "")

add_library(exampleImpl SHARED example.h example.cpp)
target_compile_features(exampleImpl PUBLIC cxx_std_17)

set_source_files_properties(example.i PROPERTIES CPLUSPLUS ON)

swig_add_library(example LANGUAGE python SOURCES example.i)
swig_link_libraries(example ${PYTHON_LIBRARIES} exampleImpl)

为确保cmake 使用正确的python 库,您可以在配置时传递适当的选项,请参阅here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    相关资源
    最近更新 更多