2008-10-08 99 views
4

我試圖在AIX 5.1機器上從Perl調用C++庫。我已經創建了一個非常簡單的測試項目來嘗試執行此操作。使用SWIG從Perl調用C++庫時發生崩潰(AIX 5.1)

我的C++共享庫(test.cpp):

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

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

我SWIG接口文件(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共享對象應該可以在perl中加載(通過SWIG生成的test.pm)。我有一個非常簡單的Perl腳本來嘗試加載共享對象和調用,我出口的一個函數(test.pl):

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

當我運行test.pl,我得到下面的輸出:

在MYFUNC()
非法指令(核心轉儲)

如果我註釋掉在myfuncstd::cout使用,它的工作沒有問題。看起來好像在C++ STL中使用任何東西都會導致核心轉儲(我試過只聲明一個std::vectorstd::stringstream,都導致了核心轉儲)。我可以創建一個獨立的C++可執行文件,它使用STL時不會出現任何問題,只有在從perl加載時在我的共享對象中調用時纔會遇到問題。

我也嘗試過使用xlc而不是gcc,但是我得到了相同的結果。我在想我需要傳入一些時髦的鏈接標誌來確保所有的鏈接都正確地發生?任何想法,歡迎...

編輯:如果我使用gcc/xlc鏈接而不是直接調用鏈接器(ld),我立即得到一個分段錯誤。它看起來像當perl試圖簡單地加載共享庫時崩潰。如上所述,調用ld是我最接近的工作方式,但我想我可能會缺少某些庫或AIX 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-否則,痛飲支持/ 1735313 – Davide 2009-11-14 19:28:08

回答

4

難道你只需添加您的libstdC++你的ld命令?例如,-lstdc++

我沒有在Linux上什麼,複製您的問題後:

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

然後問題消失。

(試圖獲得LD庫的確切右側列表是工作太多,所以我只是告訴GCC來爲我做的。)

0

我一無所知痛飲,但您可能還需要檢查它期望使用cdecl(而不是pascal,fastcall或其他調用約定)的函數。在工具之間使用錯誤的工具可能會導致「不好的事情發生」(通常會發生堆棧損壞,據我所知)。

相關問題