2010-05-22 50 views
1
編譯netcat的

我一直在試圖收集關於AIX netcat.c一段時間(使用命令make aix),但編譯器給了我一些奇怪的反饋,如:在AIX上

「netcat.c」,行117.12:1506-275(S)遇到意外的文本'int'。

在117線檢查文件netcat.c的時候,我會發現行(代碼下面第二行):

#ifdef HAVE_BIND 
extern int h_errno; 
/* stolen almost wholesale from bsd herror.c */ 

即使我改變了INT成char在相同的測試,節省該文件並重新運行該命令我得到相同的錯誤

我錯過了在閱讀錯誤代碼的東西嗎?

+0

好的,我現在在線尋找gcc來安裝在我的機器上,並嘗試用它代替cc編譯代碼。 – 2010-05-22 11:06:40

+1

@ A.Rashad,cc可能是OS附帶的腦死亡編譯器,或者是通向xlc的鏈接。我認爲gcc _is_可能是最好的選擇,特別是如果你想構建所有的FOSS/Linux-y工具。 – paxdiablo 2010-05-22 11:14:12

回答

3

如果您使用xlc(尤其是老年人),它通常由聲明語句後引起的,是這樣的:

i = i + 1; 
int x; 

你可能需要給我們多一點的情況下,如10個左右錯誤行之前的行。

如果您的使用較舊的xlc,我的建議是將gcc運行在該框上。 IBM現在製作了一些優秀的編譯器,但是早期的編譯器並沒有如此熱門(在我看來)。

+0

它確實在代碼中間有聲明。 我應該重新考慮在每個函數的開頭定義它們並再試一次嗎? – 2010-05-22 10:57:24

+1

這完全取決於你的編譯器是否允許聲明後的聲明。我認爲這是在ISO C99中引入的,但不要引用我:-)如果你的編譯器預先確定了那麼你會遇到問題,因此我建議使用最新的xlc或gcc。 – paxdiablo 2010-05-22 11:07:01

1

當無辜的代碼產生奇怪的錯誤時,嘗試通過C預處理器階段運行代碼,然後查看它。有時宏會做很有趣的事情。

另請注意,早期行(缺少分號等)上的問題可能會在後面的行上產生錯誤消息。

+0

是不是用分號寫的預處理器? 如何在預處理器階段運行代碼?任何Makefile需要更改才能這樣做? PS:我正在使用cc來編譯 – 2010-05-22 10:48:45

+1

@ A.Rashad,Artelius並不是指前面的那一行(無論如何你已經向我們顯示過)。我們需要_more_上下文才能弄清楚。 – paxdiablo 2010-05-22 10:50:19

0

@ A.Rashad,我將第117行的HAVE_BIND #ifdef塊移到第30行,該行剛好在#include「generic.h」聲明之下。這允許xlc編譯它。 (S)yntax錯誤消息不見了,雖然有一些(W)arning消息,但我最終得到了一個nc二進制文件!

心連心,

凱文

1

的後也許已經有點過時,但以防萬一別人來着同樣的問題一起...

這裏(AIX 7.1)h_errno定義作爲netdb.h中的宏。

/usr/include/netdb.h:#define h_errno (*(int *)h_errno_which()) 

因此,netcat.c行117中的聲明不起作用。

我剛換行成

#ifndef h_errno 
extern int h_errno; 
#endif 

和編譯工作順利。