我正在尝试使用 python 的 ctypes 模块包装一个 C++ 库。从上一篇文章和这篇文章中,我知道我需要使用“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 中的符号
ps 我选择 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 制作共享库的任何见解?