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::vector
및 std::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에서 작동하는 데 저주 불쌍한 영혼 도움이 될 것입니다
...
고맙습니다. 이것은 매우 유용했습니다. 불행히도 찾기가 매우 어려웠 기 때문에 비슷한 질문을 써서 다른 사람들도 도울 수 있기를 바랐습니다. http://stackoverflow.com/questions/1735199/swig-crashes-on-aix-with-python-and-probably-everything- else-swig-support/1735313 – Davide