将c ++共享库移植到python

时间:2016-11-01 13:48:40

标签: c++ gcc linker cmake shared-libraries

我有一个C ++库,我想把它移植到Python。

我不确定我知道C ++库是如何工作的,我的程序与link_dir/mylib.so链接但实际上它在加载时需要LD_LIBRARY_PATH中其他目录中的库文件。所以我需要在set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)文件中CMakeLists.txt,否则无法加载正确的库。

我写了一些代码来包装库,并想通过boost.python将它移植到Python,制作另一个共享库。

当我在C ++程序中使用该库时,它工作正常。当我尝试在Python中导入它时,它会出现此错误 ImportError: /usr/local/lib/mylib.so: unexpected reloc type 0xe7,这是什么意思?

我试过加载它链接到的相同库文件并用Python导入它,然后错误就消失了,但显然这不是正确的库。

我的CMakeLists.txt文件就像

set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
link_directories(link_dir)

# packages need by boost python
find_package(PythonLibs)
include_directories (${PYTHON_INCLUDE_DIRS})

find_package(Boost 1.45.0 COMPONENTS python)
include_directories (${Boost_INCLUDE_DIRS})

# when importing this pylib in python it gives the error
add_library(pylib SHARED pylib.cpp ${SOURCE_FILES})
target_link_libraries(pylib boost_python ${PYTHON_LIBRARIES} ${Boost_LIBRARIES} mylib.so)

# using the shared lib in c++ works fine
add_executable(main main.cpp)
target_link_libraries(main pylib)

请帮忙。

更新
我不知道我在做什么,但我尝试直接加载C ++库并获得以下内容。

# this gives the same error message
ctypes.cdll.LoadLibrary("load_dir/mylib.so")

# this is fine
ctypes.cdll.LoadLibrary("link_dir/mylib.so")

这可能是load_dir/mylib.so的问题吗?但它在很长一段时间内在其他c ++程序中运行良好。

0 个答案:

没有答案