我有一个很大的库文件,
libcore.a
,是从一个大型C语言项目生成的。我的目标是将这个库包装到 Python 项目的包中。 SWIG 是我要使用的包装工具。这是我所做的,但失败了。
我制作了以下接口文件,coreapi.i:
//file: coreapi.i
%module coreapi
%{
#include "coreapi.h"
%}
%include "coreapi.h"
和头文件 coreapi.h:
//file: coreapi.h
#ifndef coreAPI_H
#define coreAPI_H
extern int coreapi(void* data);
#endif //coreAPI_H
和一个辅助 C 文件 coreapi.c:
//file: coreapi.c
extern int core(void* data); // function defined in libcore.a
int coreapi(void* data)
{
return core(data);
}
以及我在命令行中尝试的内容(请注意,在最后一个命令中,
-L./ -lcore
是显式链接libcore.a
文件):
$ swig -python coreapi.i // this generates coreapi.py and coreapi_wrap.c
$ gcc -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/Users/me/anaconda3/include -arch x86_64 -I/Users/me/anaconda3/include -arch x86_64 -I/Users/me/anaconda3/include/python3.7m -c coreapi_wrap.c
$ gcc -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/Users/me/anaconda3/include -arch x86_64 -I/Users/me/anaconda3/include -arch x86_64 -I/Users/me/anaconda3/include/python3.7m -c coreapi.c
$ gcc -bundle -undefined dynamic_lookup -L/Users/me/anaconda3/lib -arch x86_64 -L/Users/me/anaconda3/lib -arch x86_64 -L. -lcore -arch x86_64 coreapi.o coreapi_wrap.o -o _coreapi.cpython-37m-darwin.so
一切看起来都不错,但生成的 .so 文件只有 57KB 左右,而 libcore.a 则有 47MB 左右。当我尝试将其导入 iPython 时,我得到:
$ ipython
Python 3.7.9 (default, Aug 31 2020, 07:22:35)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.19.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: import coreapi
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
<ipython-input-1-5427a8938720> in <module>
----> 1 import coreapi
~/coreapi/coreapi.py in <module>
13 from . import _coreapi
14 else:
---> 15 import _coreapi
16
17 try:
ImportError: dlopen(/Users/me/coreapi/_coreapi.cpython-37m-darwin.so, 2): Symbol not found: _core
Referenced from: /Users/me/coreapi/_coreapi.cpython-37m-darwin.so
Expected in: flat namespace
in /Users/me/coreapi/_coreapi.cpython-37m-darwin.so
任何有关如何实现这一目标的建议都将受到赞赏。我的开发环境是Mac OS Big Sur。谢谢。
如果这个问题仍然相关,请查看
build.sh
中的一个 swig 和两个 g++ 命令:https://github.com/Muzosh/liboqs-python
我基本上包装了一个 liboqs.a 库(在
oqspython.i
中使用我的自定义界面)。