2008-10-08 2 views
4

AIX 5.1 시스템에서 Perl로부터 C++ 라이브러리를 호출하려고합니다. 나는 이것을 시험해보기 위해 아주 간단한 테스트 프로젝트를 만들었습니다.SWIG (AIX 5.1)를 사용하여 Perl에서 C++ 라이브러리를 호출 할 때 크래시가 발생합니다.

내 C++ 공유 라이브러리 (test.cpp) :

#include <stdio.h> 
#include <iostream> 

void myfunc() 
{ 
    printf("in myfunc()\n"); 
    std::cout << "in myfunc() also" << std::endl; 
} 

내 꿀꺽 꿀꺽 인터페이스 파일 (test.i) :

%module test 
%{ 
void myfunc(); 
%} 
void myfunc(); 

나는 다음과 같이 공유 객체를 구축 :

swig -c++ -perl test.i 
g++ -c test_wrap.cxx -I/usr/opt/perl5/lib/5.6.0/aix/CORE -o test_wrap.o 
g++ -c test.cpp -o test.o 
ld -G -bI:/usr/opt/perl5/lib/5.6.0/aix/CORE/perl.exp -bnoentry -bexpall -lc_r test.o test_wrap.o -o test.so 

이 시점에서 공유 객체는 test.so입니다. (SWIG 생성 된 test.pm을 통해) perl에서로드 할 수 있어야합니다. 나는 공유 객체를로드하고 내가 수출하고있는 하나 개의 함수 (test.pl)를 호출하려고하는 매우 간단한 펄 스크립트가 있습니다

#!/usr/bin/perl 
use test; 
test::myfunc(); 

내가 test.pl를 실행하면, 나는 다음과 같은 출력을 얻을 :

을 (코어 덤프)이 myfunc에서

()
잘못된 명령어

내가 코멘트 아웃 경우 myfunc에서 std::cout 사용, 작동 문제없이. C++ STL에서 코어 덤프가 발생하는 것처럼 보입니다 (코어 덤프의 결과는 모두 std::vectorstd::stringstream입니다). 문제없이 STL을 사용하는 독립 실행 형 C++ 실행 파일을 만들 수 있습니다. 문제가되는 perl에서로드 할 때 내 공유 객체에서 호출 할 때만 가능합니다.

나는 또한 gcc보다는 xlc를 사용해 보았지만 같은 결과를 얻는다. 나는 링키지가 올바르게 발생하는지 확인하기 위해 전달해야하는 펑키 링커 플래그가 있다고 생각하고 있습니까? 모든 아이디어를 환영합니다 ...

편집 : 직접 (ld) 링커를 호출하는 대신 gcc/xlc을 사용하여 링크하면 즉시 세그먼트 오류가 발생합니다. perl이 단순히 공유 라이브러리를로드하려고 할 때 충돌하는 것 같습니다. 위에 설명한대로 ld을 호출하는 것이 가장 가까운 작업이지만, C++ 라이브러리의 일부 라이브러리 또는 특수 AIX 링커 플래그가 누락되었을 수 있습니다.

편집 2 : 확인되었습니다. AIX는 링크 할 때 매우 약합니다. 궁극적으로 올바르게 작동하는 것 같은 링크 명령을 내놓았습니다.

ld -G -bI:/usr/opt/perl5/lib/5.6.0/aix/CORE/perl.exp -bnoentry -bexpall -lC -lc -ldl test.o test_wrap.o -o test.so 

링크 된 라이브러리가 가장 적합합니다. 도서관이 언급 된 순서는 매우 중요합니다. 또한 이것은 AIX 5.1과 함께 제공되는 Perl 5.6.0에 대해 작성된 것입니다. Perl 5.8.8에 대해이 간단한 응용 프로그램을 빌드하려고 시도했지만 작동하지 않습니다. 그러나 나는 훨씬 더 정상적인 연결 방법 (직접 gcc/xlc을 사용하여 ld을 직접 호출하는 대신에)을 사용하는 것이 더 효과적이라고 확신합니다. 따라서이 문제는 Perl 배포판이나 링커 또는 다른 버그에있는 것으로 보입니다.희망이 AIX에서 작동하는 데 저주 불쌍한 영혼 도움이 될 것입니다

...

+0

고맙습니다. 이것은 매우 유용했습니다. 불행히도 찾기가 매우 어려웠 기 때문에 비슷한 질문을 써서 다른 사람들도 도울 수 있기를 바랐습니다. http://stackoverflow.com/questions/1735199/swig-crashes-on-aix-with-python-and-probably-everything- else-swig-support/1735313 – Davide

답변

4

당신은 당신의 ld 명령에 된 libstdC++를 추가하지 않을까요? 예 : -lstdc++?

내가 리눅스에 무슨 짓을

, 문제를 복제 한 후였다

gcc -g -lstdc++ -shared test*.o -o test.so 

그런 다음 문제가 멀리 갔다.

은 (너무 많은 작업이었다 LD에 대한 라이브러리의 정확한 권리 목록을 얻으려고, 그래서 난 그냥 나를 위해 그것을 할 수 GCC 말했다.) 나는 꿀꺽 꿀꺽에 대해 아무것도 몰라

0

,하지만 당신은 또한 확인 할 수 있습니다 그것은 파스칼, fastcall, 또는 다른 호출 규칙이 아닌 cdecl을 사용하는 함수를 기대하고있다. 도구들 사이에 잘못된 도구를 사용하면 "나쁜 일이 일어납니다"(일반적으로 스택 손상을 알 수 있습니다).

관련 문제