SWIG:如何为Python包装*.a库文件?

问题描述 投票:0回答:1

我有一个很大的库文件,

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。谢谢。

python c swig
1个回答
0
投票

如果这个问题仍然相关,请查看

build.sh
中的一个 swig 和两个 g++ 命令:https://github.com/Muzosh/liboqs-python

我基本上包装了一个 liboqs.a 库(在

oqspython.i
中使用我的自定义界面)。

© www.soinside.com 2019 - 2024. All rights reserved.