我正在尝试使用ctypes模块为python包装C ++库。 从previous post和this,我知道我需要使用“extern C”来包装公共接口,以便不会损坏对象名称。
我的公共接口只是一个函数调用(没有类包装或其他)。但是我的C ++库本身就广泛使用了类静态成员对象。我发现如果我编译C ++库,我总会得到类似的东西:
OSError: /mylib.so: undefined symbol: _ZN4bitarr_10lenE
从未定义符号的错位名称,我可以看出它们是类中定义的静态对象。这些静态对象仅在C ++端使用,并不打算包装为从python接口。有没有办法可以将它们从.so文件中的公共符号名称中排除,以便ctypes不会抱怨?更具体地说,我通过
编译了.so文件g++ -shared -Wl,-soname,mylib -o mylib.so publiclib.o privatelib.o
这样,所有函数都将被包装为公共接口(无论它们是来自publiclib.o还是privatelib.o)。我想我的问题是如何只暴露来自publiclib.o的符号,而不是来自privatelib.o的符号
P.S。我选择ctypes是因为我的python接口非常简单(只需调用一次C ++函数)。我环顾四周并考虑了其他解决方案,如Cython和Boost.Python,但我有一些担心在分发代码时必须捆绑Boost或Cython。根据我对python / c ++交互的有限知识,ctypes似乎是一种更便携的方式。
编辑:似乎我可以通过放置
来抑制某些功能和成员功能的暴露__attribute__ ((visibility ("hidden"))
申报。但是当我对类的静态成员变量执行此操作时,链接器无法链接并报告
relocation R_X86_64_32S against `bitarr_len` undefined symbol cannot be used when making a shared object
关于如何在为ctypes创建共享库时使用静态类成员的任何见解?