我用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
?
这是一个小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。