• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 編譯源碼 第三篇(FAQ)

    發表于:2007-05-25來源:作者:點擊數: 標簽:缺少第三Build源碼faq
    缺少 Build 文件或該文件異常 源代碼目錄沒有‘configure’文件,怎么辦? 在這種情況下,您得自己處理‘Makefile’文件。 只有開頭大寫的幾行需要看看,可能還要作適當修改,當然‘Makefile’文件中不會都是這樣的行。 缺少 Build 文件或該文件異常 源代碼

    * 缺少 Build 文件或該文件異常

    源代碼目錄沒有‘configure’文件,怎么辦?

    在這種情況下,您得自己處理‘Makefile’文件。
    只有開頭大寫的幾行需要看看,可能還要作適當修改,當然‘Makefile’文件中不會都是這樣的行。

    缺少 Build 文件或該文件異常

    源代碼目錄沒有‘configure’文件,怎么辦?

    在這種情況下,您得自己處理‘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 了。

    源代碼目錄中有‘Imakefile’、‘GNUmakefile’或‘Makefile.cvs’,但沒有正常的‘ Makefile’。

    ‘Imake’是老版本的‘configure’,直接運行命令:

    xmkmf -a

    將從‘Imakefile’產生一個‘Makefile’文件,這個命令在‘XFree86-devel’包中。然后照前面講過的步驟繼續。

    ‘GNUmakefile’和‘Makefile’是一樣的,都可以用‘make’來處理。

    如果您有‘Makefile.cvs’文件,可運行

    make -f Makefile.cvs'

    這將產生一個‘configure’文件。

    源碼目錄下沒有任何 build 文件。

    首先,您在有源碼的子目錄中,看看有沒有這樣的文件。然后,找有沒有可執行的文件:

    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

    * section index * top

    * Build File 問題

    ‘configure’抱怨缺少庫/頭文件,但實際這些文件已經安裝了。

    出現這樣的錯誤,至少有以下三種可能:

    1. ‘configure’沒有找到含有該庫的目錄。
      如果是這樣,您得用‘configure’的參數‘--with-extra-libs=[DIR]’添加該庫的目錄。對于頭文件則用‘--with-extra-includes=[DIR]’。

    2. ‘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

    3. ‘configure’腳本中的文字(typo)錯誤
      仔細看一下‘config.log’中的出錯信息,特別是庫和頭文件名的大小寫錯誤。這種情況很少見(大概一年里能碰到一兩回),但有這種可能,請相信我…… ;-)。

    為何自編譯的程序好象少了些應該有的功能?

    這取決于程序作者,缺少哪些庫,‘configure’或‘make’才會出錯中止。 所以成功的編譯并不保證最后的程序有全部的功能。好好研究一下‘config.log’文件,看看到底是少了哪些庫,然后安裝后,再編譯試試。

    * section index * top

    * Building 問題

    我已經安裝了缺少的庫,但‘configure’或‘make’依然說找不到,怎么會這樣?

    由于‘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’命令新建需要的符號鏈接。第一個參數是存在的文件名,第二個是您希望創建的符號鏈接名稱。

    新建時,您得小心了,因為這有可能破壞其他程序。如果可能,向開發員核實,因為作者對此最清楚。

    原文轉自:http://www.kjueaiud.com

    評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>