2009-11-14 4 views
2

SWIG는 AIX에서 쉽게 컴파일하고 설치합니다. 불행하게도 컴파일/링커 프로세스의 세부 사항에 따라 Segmentation Fault 또는 Illegal Instruction으로 간단하게 SWIG hello world (컴파일은되지만 그렇게 쉽게 이루어지지 않음)과 충돌합니다. 이것은 gcc와 xlc (IBM c 컴파일러) 모두에서 발생합니다. 동음 이의어 GNU ld가 내 시스템에 설치되지 않았기 때문에 원시 AIX 링커 ld 만 시도했습니다.SWIG가 AIX에서 충돌합니다 (파이썬이 있고 아마도 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); 
} 

파일 : 본보기

%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) 

또는 GCC, 또는 파이썬의 다른 버전을 사용

$ python -c "import example" 
Segmentation fault (core dumped) 

(우리는 7있다!) 32 비트나 64 비트는 아무것도 변경되지 않습니다 : 당신은 "좋은"링크를 찾을 수 있습니다 옵션이 있지만 런타임에 충돌합니다. 어떻게 해결할 수 있을까요?

답변

0

이것은 실제 질문이 아니지만 문제를 해결 한 방법에 대한 보고서입니다 (here 참조). 실제로 저는 직접 해결할 수 없었지만, this other guy 덕택입니다. 그가 너무 구체적 (perl과 C++을 사용하는 AIX 5.1과 내가 다른 것을 찾고있는 동안 나는 그를 세레 닉 틱하게 발견했기 때문에 여기에 다시 쓰고있다. 내가 이것을 찾을 때 그의 대답을 전혀 찾을 수 없었다. 문제는!이 게시물이 다른 사람들에게 더 찾을 수 있기를 바란다. 내 문제는 AIX 5.3에서 Python과 C가있다. 나는 AIX에서 모든 SWIG 설치에 공통적이라고 생각한다. (따라서 파이썬과 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 

열쇠는 당신이 당신의 언어/설치를 위해 자신을 발견한다 특급 파일입니다 :

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

희망이 도움이됩니다.

1

이 게시물은 직접적으로 도움이되지 않았지만 올바른 방향으로 다시 지적했습니다. 그런데 상황이 다르기 때문에 임베디드 파이썬을 구축하고 있습니다. http://docs.python.org/extending/embedding.html#linking-requirements

>>> import distutils.sysconfig 
>>> distutils.sysconfig.get_config_var("LINKFORSHARED") 
'-Wl,-bE:Modules/python.exp -lld'