兩個工作資歷加起來超過 15 年,可跨 UNIX/Windows 開發軟體的工程師,為了要在 Ubuntu 上編譯 C 的 hello world 程式,竟然要花上半小時。

工程師 A:「B 你能不能來幫我看看,為甚麼 configure 不過。」

工程師 B 仔細地看了一下螢幕上的 error messages,發現是因為找不到 crt1.o

工程師 B:「看起來像是 libc 沒有裝,我們可以試著編一個 hello world 來確認。」

於是工程師 A 寫了一個 hello.c 如下:

#include <stdio.h>

int main()
{
    printf("Hello World\n");
    return 0;
}

用 gcc 編譯,gcc 會動,但跑出錯誤訊息,說找不到 stdio.h

工程師 B:「果然。」

工程師 A 順手打了一下指令:

SHELL> locate stdio.h
Not found.

工程師 A:「Ubuntu 應該是用 apt-get 安裝軟體吧?」

工程師 A 試著下指令:

SHELL> sudo apt-get install libc
Cannot find package libc

工程師 B:「可能是叫做 glibc。」

工程師 A 試著再下指令:

SHELL> sudo apt-get install glibc
Cannot find package glibc

工程師 A:「見鬼了,誰知道 libc 應該要叫什麼啊!要怎麼知道套件的名字是什麼?」

工程師 A 試著打下面的指令:

SHELL> apt-get search libc
Invalid command 'search'.

工程師 B:「還是用 GUI 工具好了,至少應該會有個搜尋框可以用。」

工程師 A 從系統選單裡找到 synaptic 這支程式,查了幾次, 用 glibc 找不到任何東西,後來改用 libc 當關鍵字找,終於找到 libc6-dev 這個套件[1]

實在無法理解,為什麼 apt-get 沒有提供搜尋的功能,誰知道到底套件叫做 libcglibc 還是 libc6-dev 啊。後來我知道,似乎搜尋的指令下法是 apt-cache search,可是 cache 這個字眼,跟 search 感覺上就是沾不到邊,真是莫名其妙的組合。其實我覺得,apt-getget 也很莫名其妙,感覺上就是功能越做越多,沒有一開始就設計完善,最後只好通通塞在一起。

用 synaptic 的過程也是挫折感十足。利用其搜尋功能,確實地找到了 libc6-dev 這個套件,可是勾選安裝後,就不曉得接下來要怎麼辦,才能真的開始安裝。樸素的視窗,兩個人硬是 try 了十分鐘,才終於明瞭,要按工具列的「Apply」按鈕,才能開始安裝。誰知道這個 Apply 是在 apply 什麼啊,難道不能用個「Start」或「Next」的按鈕嗎?又不是在搞 version control,還要下個 commit 才會真正改變 repository。

最後,總算成功地編譯了 hello world,花了半小時。XD

然後我還是不懂,為什麼預設裝好有 gcc 但沒有 libc 跟標準 C 的 include files 可以用。要嘛就通通不要有開發工具,要嘛就基本的要裝齊全。不是每個人都是 kernel developer 好嗎?

後記:後來我們又發現,從頭到尾,我們是在 live cd 上工作,而不是在真正已經安裝在硬碟裡的 ubuntu 裡工作。難怪網路怎麼設都不會通。-.-||


  1. Glibc 就 glibc,好好的把自己叫做 libc 幹什麼?全天下又不是只有一個 libc。