我有一个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 ++程序中运行良好。