Интеграция с Python и C ++. Проблемы с динамической библиотекой - PullRequest
0 голосов
/ 16 февраля 2019

Я использую Swig. (Mac OS 10.13)

Мой сценарий оболочки:

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

Я потратил достаточно времени, чтобы искать, как создать динамическую библиотеку C ++ для Python, но я никогдаиспользуется последняя строка. Чаще всего я создаю библиотеку из 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?

1 Ответ

0 голосов
/ 17 февраля 2019

Вот небольшой 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, вы можете передать соответствующую опцию во время настройки,см здесь .

...