2009-11-14 77 views
2

SWIG可以在AIX上轻松编译和安装。不幸的是,一个简单的SWIG hello world(它也编译 - 但不是那么容易)崩溃与分段错误或非法指令(取决于编译/链接器过程的一些细节)。 gcc和xlc(IBM c编译器)都会发生这种情况。我只尝试了本地AIX链接器ld,因为同名的GNU ld没有安装在我的系统上。SWIG在AIX上崩溃(使用python,可能还有其他所有SWIG支持)

文件: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(&ltime); 
    return ctime(&ltime); 
} 

文件: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 

接头步骤是有问题的一个。如果你遵循的tutorial的例子,你应该做的

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本机链接器获得的最常见的共享对象(所以)根本没有符号(实际上小于1kB)。它也很容易得到链接器坏了输出(在这种情况下,一个相当长将出现如下未解决的符号列表,同时连接):

ld: 0711-317 ERROR: Undefined symbol: PyType_Type 

做什么一个supposed to do,它似乎很清楚,该解决方案使用各种链接器选项进行黑客攻击:-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位不会改变任何东西:你可以找到一个“好”链接选项,但它在运行时崩溃。如何解决这个问题?

回答

0

这不是一个真正的问题,而是一个关于我如何解决问题的报告(请参阅here为什么我这样做)。实际上我自己无法解决,但是这要归功于this other guy。我在这里重写它,因为他太具体了(AIX 5.1中有perl和C++,当我寻找其他东西的时候,我发现他是偶然的!当我寻找这个时,我一直无法找到他的答案问题!我希望这篇文章对其他人更容易找到 我的问题是在AIX 5.3上使用python和C.我相信它在AIX上安装每个SWIG都是常见的(因此我没有标记python和C)。我们会尽快与开发人员联系,以便他们可以首先解决问题。

好了,解决方法是简单地使用不同的连接线,特别是如下:

ld -G -bI:/your-python-path/lib/python2.5/config/python.exp -bnoentry -bexpall -lC -lc -ldl example.o example_wrap.o -o _example.so 

的关键是EXP文件,你会发现自己的语言/安装:

find /your-python-or-perl-or-other-language-path/ -name *exp 

希望这有助于!