在這種情況下,您得自己處理‘Makefile’文件。
只有開頭大寫的幾行需要看看,可能還要作適當修改,當然‘Makefile’文件中不會都是這樣的行。
在這種情況下,您得自己處理‘Makefile’文件。
只有開頭大寫的幾行需要看看,可能還要作適當修改,當然‘Makefile’文件中不會都是這樣的行。
CC = compiler
告訴‘make’用哪種編譯器。在大多數情況下,GCC都能勝任,C++ 程序則要用 G++。INCDIR = -I/path/dir1 -I/path/dir2 etc
將告訴‘make’到哪個目錄去找頭文件,請核實一下,看看您的系統是否能夠滿足。LIBDIR = -L/path/dir1 -L/path/dir2 etc
告訴‘make’到哪個目錄下找庫文件,這也需要核實。LIBS = -llib1 -llib2 -llib3 etc
告訴‘make’需要哪些庫。請記?。骸?llib’是‘liblib.so’的縮寫。用 locate liblib.so 可以確認這個需要的庫是否已安裝。有時,這個變量用 LFLAGS 來表示。現在可以運行 make 了。
‘Imake’是老版本的‘configure’,直接運行命令:
xmkmf -a
將從‘Imakefile’產生一個‘Makefile’文件,這個命令在‘XFree86-devel’包中。然后照前面講過的步驟繼續。
‘GNUmakefile’和‘Makefile’是一樣的,都可以用‘make’來處理。
如果您有‘Makefile.cvs’文件,可運行
make -f Makefile.cvs'
這將產生一個‘configure’文件。
首先,您在有源碼的子目錄中,看看有沒有這樣的文件。然后,找有沒有可執行的文件:
find . -type f -perm -700
這個命令將列出所有當前目錄及其子目錄中的可執行文件。
如果什么也沒找到,那看來您得直接用編譯器編譯源碼文件了。很有可能那兒只有一個 *.c 文件,用:
gcc -o new_name file.c
‘-o new_name’定義的是生成的二進制文件名。如果目錄中有多個 *.c(或*.C、*.cc、*.cxx)文件,應當省略‘-o’參數。這樣,結果會是一個標準名稱:‘a.out’,您可能要將其改為其他名稱。
如果需要增加其他 include、library 或 library 的目錄,您得直接在‘gcc’后面添加命令行參數,比如
gcc -o new_name file.c -L/path/dir -llib -I/path/dir
出現這樣的錯誤,至少有以下三種可能:
‘configure’沒有找到含有該庫的目錄。
如果是這樣,您得用‘configure’的參數‘--with-extra-libs=[DIR]’添加該庫的目錄。對于頭文件則用‘--with-extra-includes=[DIR]’。
‘configure’找到的是庫的另外一個版本。
現在,一個顯著得例子就是用到 Qt2 來編譯的軟件。由于 Qt2 的次級版本號(minor version)舊了些(如最好用 2.2.2 而不是已安裝的 2.2.1),‘configure’會報錯。這樣的話,您要升級一下。
另一種常見的問題是 Qt1 和 Qt2(Qt3……)都
安裝了,但默認時,‘configure’找的是‘/usr/lib/qt’目錄,而在 Mandrake Linux 中,這是 Qt1
的安裝目錄,Qt2 是在‘/usr/lib/qt2’,Qt3
在‘/usr/lib/qt3’。如果是這樣,您得給‘congfigure’添加參數,如:
./configure --with-qt-dir=/usr/lib/qt2
‘configure’腳本中的文字(typo)錯誤
仔細看一下‘config.log’中的出錯信息,特別是庫和頭文件名的大小寫錯誤。這種情況很少見(大概一年里能碰到一兩回),但有這種可能,請相信我…… ;-)。
這取決于程序作者,缺少哪些庫,‘configure’或‘make’才會出錯中止。 所以成功的編譯并不保證最后的程序有全部的功能。好好研究一下‘config.log’文件,看看到底是少了哪些庫,然后安裝后,再編譯試試。
由于‘configure’和‘make’的結果被緩存了,要用
make distclean
刷新源碼目錄。這樣做后,就能保證再編譯時,會重新檢查系統。
如果‘Makefile’沒有提供‘distclean’目標,那可以用
make clean && rm config.cache
另一個這類問題的原因是,這個已安裝庫的目錄并沒有在‘/etc/ld.so.conf’文件中列出。這個文件搜集的是標準庫位置(如‘/usr/lib’、‘/lib’)以外的目錄,Linux Loader/Linker ‘ld’在這些地方尋找相應的庫。
比如,新安裝的庫放在‘/usr/local/lib’,但這個目錄不在‘/etc/ld.so.conf’中,因此這個庫在系統中就不可用。
要修改的話,只要將目錄添加進‘/etc/ld.so.conf’,然后用‘root’帳號運行:
ldconfig
現在,刷新源碼目錄,再編譯試試。
在大多數情況下,build 過程不會尋找指定次級版本號(a specfic minor version)的庫,真正需要的是‘/usr/lib’目錄下,合適的符號鏈接(symlink)。
下面列出‘/usr/lib’中的‘libungif.so’作為例子(有刪改):
lrwxrwxrwx /usr/lib/libungif.so -> libungif.so.4.1.0*
lrwxrwxrwx /usr/lib/libungif.so.3 -> libungif.so.3.1.0*
-rwxr-xr-x /usr/lib/libungif.so.3.1.0*
lrwxrwxrwx /usr/lib/libungif.so.4 -> libungif.so.4.1.0*
-rwxr-xr-x /usr/lib/libungif.so.4.1.0*
這里安裝了兩個版本的庫:libungif.so.4.1.0 和 libungif.so.3.1.0(以 * 標識)。另外,還有三個符號鏈接(entries以 ‘l’開頭):libungif.so、libungif.so.3 及 libungif.so.4。
符號鏈接不是真正的文件,而是指向其他文件的指針(pointer)。
build 進程將在‘/usr/lib’中找到‘libungif.so.3’,然后由符號鏈接指向實際安裝的次級版本的庫,在這里是 3.1.0。
現在我們假定開發員沒有明確(有時會意外發生),所以 build 進程只會找‘libungif.so’。而在這個例子中,指向的是‘libungif.so.4.1.0’——庫的另一主版本(major version)。但不同主版本間一般是無法相容的,所以,如果可執行文件依賴的是主版本為 3 的庫,但 build 進程找到的主版本是 4,‘make’或‘configure’將出錯中止,而且抱怨說‘missing library’(缺少庫)或‘undefined reference’(未知的引用)。
對于第一個問題,簡單的辦法是為 build 進程重置符號鏈接:
ln -sf /usr/lib/libungif.so.3.1.0 /usr/lib/libungif.so
如果您碰到了第二個問題,可以用‘ln’命令新建需要的符號鏈接。第一個參數是存在的文件名,第二個是您希望創建的符號鏈接名稱。
新建時,您得小心了,因為這有可能破壞其他程序。如果可能,向開發員核實,因為作者對此最清楚。