Discussion:
[問題] 請問關於make出來的錯誤訊息...
(时间太久无法回复)
小州
2003-10-04 17:33:08 UTC
Permalink
gcc version 3.2.2 (Mandrake Linux 9.1 3.2.2-3mdk)
編譯 NachOS-4.0/code/build.linux 時的錯誤訊息
在輸入 make 後... 最後出現如下...
../lib/sysdep.cc:532: `errno' undeclared (first use this function)
../lib/sysdep.cc:532: (Each undeclared identifier is reported only once for each function it appears in.)
make: *** [sysdep.o] Error 1
看樣子好像少了 errno 這個東東
接下來我就卡住了...^^|
到 http://www.rpmfind.net 也找不到 errno
在 Google 找到 http://i30www.ira.uka.de/teaching/courseforum.php?courseid=74
但是也不知道要怎麼解決...o(>﹏<)o
自己改一下該程式碼檔案,引入 errno.h 檔案。

#include <errno.h>

--
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

現代人普遍的現象: 「小學而大遺」、「捨本而逐末」
「以偏而概全」、「因噎而廢食」
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
--
※ Origin: SayYA 資訊站 <bbs.sayya.org> 
◆ From: kendlee.sayya.org
小州
2003-10-06 18:13:58 UTC
Permalink
小弟有引入 errno.h 可是它還是找不到耶... ^^|
好煩啊~~~ o(>﹏<)o
請提供 tarball source 讓大家編譯測試一下吧. :-)

--
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

現代人普遍的現象: 「小學而大遺」、「捨本而逐末」
「以偏而概全」、「因噎而廢食」
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
--
※ Origin: SayYA 資訊站 <bbs.sayya.org> 
◆ From: kendlee.sayya.org
小州
2003-10-07 09:11:44 UTC
Permalink
呼~~~終於編譯成功了...
Debian gcc-2.95 一切OK 粉順暢地勒~~~ *^^*
Mandrake 9.1 gcc-2.96 不行...但是系統安裝簡單設定容易馬上就可以用了
RedHat 7.3 可以...但是我可不想為了一個Nachos用這過時的版本
其他的沒試過...不知道...^^|
gcc 3.3 都已經出來了,往後的 gcc 2.5 版本將會逐漸被新的 gcc 取代,
所以可以的話修正該程式碼能夠於 gcc 3 編譯應該是比較好的方式 :-)

不過這個應該交給該程式的 maintainer 來改比較適合 :-)

--
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

現代人普遍的現象: 「小學而大遺」、「捨本而逐末」
「以偏而概全」、「因噎而廢食」
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
--
※ Origin: SayYA 資訊站 <bbs.sayya.org> 
◆ From: kendlee.sayya.org
小州
2003-10-08 09:10:31 UTC
Permalink
Post by 小州
gcc 3.3 都已經出來了,往後的 gcc 2.5 版本將會逐漸被新的 gcc 取代,
所以可以的話修正該程式碼能夠於 gcc 3 編譯應該是比較好的方式 :-)
不過這個應該交給該程式的 maintainer 來改比較適合 :-)
如果是 errno 找不到的話, 都應該只是函示庫版本問題
而非 gcc 版本的問題....
errno 是 ansi c 裡面,i/o 函式提供的一個整體變數,所以通常不會
找不到。找不到該變數,要看過該 source 後才會知道原因。

--
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

現代人普遍的現象: 「小學而大遺」、「捨本而逐末」
「以偏而概全」、「因噎而廢食」
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
--
※ Origin: SayYA 資訊站 <bbs.sayya.org> 
◆ From: kendlee.sayya.org
小州
2003-10-08 09:47:06 UTC
Permalink
Post by 小州
errno 是 ansi c 裡面,i/o 函式提供的一個整體變數,所以通常不會
找不到。找不到該變數,要看過該 source 後才會知道原因。
會沒有 errno 的情況就是沒有 extern int errno;
(應該沒有那個 libc 不把 errno 編進去吧 ^^;)
而這個宣告通常都在 /usr/include/errno.h 裡面
沒宣告到可能有三個原因: 沒 include, errno 的宣告換了位置,
errno 被 #ifdef 隔離
所以不要狂猜了,看過 source code 後比較編譯並順便一下就知道。

--
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

現代人普遍的現象: 「小學而大遺」、「捨本而逐末」
「以偏而概全」、「因噎而廢食」
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
--
※ Origin: SayYA 資訊站 <bbs.sayya.org> 
◆ From: kendlee.sayya.org
小州
2003-10-08 10:34:57 UTC
Permalink
Post by 小州
所以不要狂猜了,看過 source code 後比較編譯並順便一下就知道。
沒有狂猜啊.....
只是把錯歸到 gcc 上面, 是不是有點走錯路了?
應該是去查 /usr/include 裡的 header 檔
也可以用 gcc -E 看一下通過 preprocessor 之後變成什麼樣子
我已經告訴對方 #include <errno.h> 還不可以,那您說是否應該
看到該 source code 再來 trace code 是否好一點呢 :-)

--
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

現代人普遍的現象: 「小學而大遺」、「捨本而逐末」
「以偏而概全」、「因噎而廢食」
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
--
※ Origin: SayYA 資訊站 <bbs.sayya.org> 
◆ From: kendlee.sayya.org
我回來了
2003-10-08 13:17:29 UTC
Permalink
※ 引述《kenduest (小州)》之銘言:
Post by 小州
如果是 errno 找不到的話, 都應該只是函示庫版本問題
而非 gcc 版本的問題....
errno 是 ansi c 裡面,i/o 函式提供的一個整體變數,所以通常不會
找不到。找不到該變數,要看過該 source 後才會知道原因。
source code:
http://rtlab.csie.ntu.edu.tw/course/OSCourse/nachos_40.tar.gz
其實是OS課程中用來當作教材的,project就是要trace code。
原版的在這裡:
http://www.cs.washington.edu/homes/tom/nachos/
不過已經很久沒有maintain了........:(
--
※ Origin: SayYA 資訊站 <bbs.sayya.org> 
◆ From: 61-229-57-52.hinet-ip.hinet.net
小州
2003-10-08 14:24:28 UTC
Permalink
※ 引述《lcp (我回來了)》之銘言:
Post by 我回來了
※ 引述《kenduest (小州)》之銘言:
Post by 小州
errno 是 ansi c 裡面,i/o 函式提供的一個整體變數,所以通常不會
找不到。找不到該變數,要看過該 source 後才會知道原因。
source code:
http://rtlab.csie.ntu.edu.tw/course/OSCourse/nachos_40.tar.gz
其實是OS課程中用來當作教材的,project就是要trace code。
原版的在這裡:
http://www.cs.washington.edu/homes/tom/nachos/
不過已經很久沒有maintain了........:(
因為裡面有 thread 的 code,而這個部份在後來的 gcc 有改過架構,
不直接參考整體的 errno 變數。因為每個 thread 的 errno 應該各自
獨立才對。

改一下 code,lib/sysdep.cc 檔案找到如下內容。

#if defined CYGWIN
cerr << "called with " << packetSize << ", got back " << retVal
<< ", and " << "\n";
#else
cerr << "called with " << packetSize << ", got back " << retVal
<< ", and " << errno << "\n";
#endif

把 #else ... #endif 裡面的 << errno << "\n"; 改成 << "\n" 就可以了。

--
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

現代人普遍的現象: 「小學而大遺」、「捨本而逐末」
「以偏而概全」、「因噎而廢食」
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
--
※ Origin: SayYA 資訊站 <bbs.sayya.org> 
◆ From: kendlee.sayya.org
小州
2003-10-08 15:24:53 UTC
Permalink
小弟十分同意
不過就小弟所知, errno 在 glibc-2.1.3 以後都合 thread-safe 的規定
這部份應該是不需要操心的......
請自己參閱 /usr/src/include/bits/errno.h 檔案內容。

# if !defined _LIBC || defined _LIBC_REENTRANT
/* When using threads, errno is a per-thread value. */
# define errno (*__errno_location ()

這段程式碼你看的懂內容嗎?

--
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

現代人普遍的現象: 「小學而大遺」、「捨本而逐末」
「以偏而概全」、「因噎而廢食」
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
--
※ Origin: SayYA 資訊站 <bbs.sayya.org> 
◆ From: kendlee.sayya.org

Loading...