2010-04-21 130 views
1

我正在嘗試使用xlc/xlC編譯器在AIX上交叉編譯。AIX xlc交叉編譯/鏈接for C++找不到C符號

代碼在其他機器上使用默認設置時編譯成功。代碼實際上是用交叉編譯成功編譯的,但問題來自鏈接器。這是物體連接起來的命令:

$(CHILD_OS)/usr/vacpp/bin/xlC -q32 -qnolib -brtl -o $(EXECUTABLE) $(OBJECT_FILES) 
-L$(CHILD_OS)/usr/lib 
-L$(CHILD_OS)/usr/vacpp/lib/profiled 
-L$(CHILD_OS)/usr/vacpp/lib 
-L$(CHILD_OS)/usr/vac/lib 
-L$(CHILD_OS)/usr/lib 
-lc -lC -lnsl -lpthread 
-F$(CHILD_OS)$(CUSTOM_CONFIG_FILE_LOCATION) 

當我試圖鏈接代碼,我得到幾個未定義的符號: .setsockopt(INT,INT,INT,常量無效*,無符號長)。 socket(int,int,int),.connect(int,const sockaddr *,unsigned long)等。

我發現缺少的符號來自標準c庫libc.a.當我用nm查找正在拾取的libc.a時,符號確實存在。我猜測C++無法讀取C對象可能存在問題,但我確實在黑暗中拍攝。

回答

1

聽起來像它可能是一個C++名稱mangling問題。

對目標文件運行nm以找出它們正在查找的符號。然後比較確切的名稱和庫。

然後檢查編譯命令,以確保正確的版本的頭文件被包括在內 - 也許它包括父操作系統的錯誤複製?

+0

我懷疑是否包含父操作系統的頭文件(-qnolib和-qnostdinc對於xlc/xlC是等效的)。我在包含的庫目錄下運行了nm對libc.a,並找到了所有符號。不幸的是,好的建議已經嘗試過了。 – bogertron 2010-04-22 15:53:47

+0

我建議在對象文件中運行nm,找出正在查找的真正符號 - xlc列出的符號看起來像C++引用的demangled版本。 – 2010-04-22 21:32:37

0

我終於能夠解決這個問題。它看起來像我使用C++編譯器的.c文件。使用xlc編譯器替代C文件的xlC編譯器修復了此問題。