SWIG 可以在 AIX 上轻松编译和安装。不幸的是,一个简单的SWIG hello world(它也可以编译——但不是那么容易)会因分段错误或非法指令而崩溃(取决于编译/链接器过程的一些细节)。gcc 和 xlc(IBM c 编译器)都会发生这种情况。我只尝试了本地 AIX 链接器 ld,因为我的系统上没有安装同音词 GNU ld。
文件:example.c
#include <time.h>
double My_variable = 3.0;
int fact(int n) {
if (n <= 1) return 1;
else return n*fact(n-1);
}
int my_mod(int x, int y) {
return (x%y);
}
char *get_time()
{
time_t ltime;
time(<ime);
return ctime(<ime);
}
文件:example.i
%module example
%{
/* Put header files here or function declarations like below */
extern double My_variable;
extern int fact(int n);
extern int my_mod(int x, int y);
extern char *get_time();
%}
extern double My_variable;
extern int fact(int n);
extern int my_mod(int x, int y);
extern char *get_time();
生成文件片段:
swig -python example.i
xlc -q64 -c example.c example_wrap.c -I/your-python-path/include/python2.5/
ld -G -b64 -berok -bnoentry -bexpall -brtl example.o example_wrap.o -o _example.so
链接器步骤是有问题的。如果您按照教程中的示例进行操作,则应该这样做
ld -bshared example.o example_wrap.o -o _example.so #the b is not a typo, but a different syntax in AIX vd GNU ld
不幸的是,由于几个原因,这不起作用。我相信 IBM/AIX 和开源社区对“共享库”的含义有着截然不同的想法。您从 AIX 本机链接器获得的最常见的共享对象 (so) 中根本没有任何符号(实际上大小小于 1kB)。从链接器获取损坏的输出也很容易(在这种情况下,链接时会出现很长的未解析符号列表,如下所示):
ld: 0711-317 ERROR: Undefined symbol: PyType_Type
做一个应该做的事情,很明显解决方案是使用各种链接器选项进行黑客攻击,-berok
, -bnoentry
, -bexpall
, -brtl
, -bshared
, -bM:SRE
, -bexpfull
. 事实上,可以找到一些组合来创建非空的 .so 库,而不会产生错误。上面的 Makefile 片段中报告了其中一种组合(还有其他组合)。不幸的是,它们都在以下两种模式之一中失败!
$ python -c "import example"
Illegal instruction (core dumped)
或者
$ python -c "import example"
Segmentation fault (core dumped)
使用 gcc 或不同版本的 python(我们有 7 个!) 32 位或 64 位不会改变任何东西:您可以找到一个“好的”链接选项,但它在运行时崩溃。如何解决这个问题?