【正文】
鏈接外部庫(kù) ? 庫(kù)是預(yù)編譯的目標(biāo)文件 (object files)的集合,它們可被鏈接進(jìn)程序。靜態(tài)庫(kù)以后綴為‘ .a’的特殊的存檔文件 (archive file)存儲(chǔ) 。 ? 標(biāo)準(zhǔn)系統(tǒng)庫(kù)可在目錄 /usr/lib 與 /lib 中找到。比如,在類 Unix 系統(tǒng)中 C 語(yǔ)言的數(shù)學(xué)庫(kù)一般存儲(chǔ)為文件 /usr/lib/。該庫(kù)中函數(shù)的原型聲明在頭文件 /usr/include/ 中。 C 標(biāo)準(zhǔn)庫(kù)本身存儲(chǔ)為 /usr/lib/,它包含 ANSI/ISO C 標(biāo)準(zhǔn)指定的函數(shù),比如‘ printf’。對(duì)每一個(gè) C 程序來說, 都默認(rèn)被鏈接。 ? 下面的是一個(gè)調(diào)用數(shù)學(xué)庫(kù) 中 sin 函數(shù)的的例子: Linux操作系統(tǒng) ? 代碼 : include include ? int main (void) { double x = sin ()。 printf (The value of sin() is %f\n, x)。 return 0。 } ? 嘗試單獨(dú)從該文件生成一個(gè)可執(zhí)行文件將導(dǎo)致一個(gè)鏈接階段的錯(cuò)誤: 代碼 : $ gcc Wall o calc /tmp/: In function `main39。: +0x1b): undefined reference to `sin39。 Linux操作系統(tǒng) ? 函數(shù) sin,未在本程序中定義也不在默認(rèn)庫(kù)‘ ’中;除非被指定,編譯器也不會(huì)鏈接‘ ’。 ? 為使編譯器能將 sin 鏈接進(jìn)主程序‘ ’,我們需要提供數(shù)學(xué)庫(kù)‘ ’。一個(gè)容易想到但比較麻煩的做法是在命令行中顯式地指定它: ? 代碼 : $ gcc Wall /usr/lib/ o calc ? 函數(shù)庫(kù)‘ ’包含所有數(shù)學(xué)函數(shù)的目標(biāo)文件,比如 sin,cos,exp,log及 sqrt。鏈接器將搜索所有文件來找到包含 sin 的目標(biāo)文件。 ? 一旦包含 sin 的目標(biāo)文件被找到,主程序就能被鏈接,一個(gè)完整的可執(zhí)行文件就可生成了 Linux操作系統(tǒng) ? 代碼 : $ ./calc The value of sin() is ? 可執(zhí)行文件包含主城許的機(jī)器碼以及函數(shù)庫(kù)‘ ’中 sin 對(duì)應(yīng)的機(jī)器碼。 ? 為避免在命令行中指定長(zhǎng)長(zhǎng)的路徑,編譯器為鏈接函數(shù)庫(kù)提供了快捷的選項(xiàng)‘ l’。例如,下面的命令 ? 代碼 : $ gcc Wall lm o calc ? 與我們上面指定庫(kù)全路徑‘ /usr/lib/’的命令等價(jià)。 ? 一般來說,選項(xiàng) lNAME使鏈接器嘗試鏈接系統(tǒng)庫(kù)目錄中的函數(shù)庫(kù)文件 。一個(gè)大型的程序通常要使用很多 l 選項(xiàng)來指定要鏈接的數(shù)學(xué)庫(kù),圖形庫(kù),網(wǎng)絡(luò)庫(kù)等。 Linux操作系統(tǒng) ? 編譯 C++ ? 你可能知道: GCC 是 GNU 編譯器集合( GNU Compiler Collection)的首字母縮寫詞。它可以編譯 C, C++, ObjectiveC, Java 和 Ada 語(yǔ)言。 ? 前面我們只涉及到 C 語(yǔ)言,那么如何用 gcc 編譯其他語(yǔ)言呢? ? 編譯 c++ ? (下面兩條命令是等價(jià)的,不過我相信你會(huì)選擇前者 ^_^) 代碼 : g++ Wall o hello gcc Wall o hello lstdc++ Linux操作系統(tǒng) ? 如果 gcc版本 ,那么以下命令任選其一 代碼 : g77 Wall o hello gcc Wall o hello lfrtbegin lg2c Linux操作系統(tǒng) ? Anjuta 只不過是個(gè)寫 C,C++ 的 IDE環(huán)境而已。配備庫(kù)文件后,才可以寫程序,包括在終端運(yùn)行的程序(類似于 DOS程序),和圖形界面程序(類似于窗口程序)。 ? 下面就用 Anjuta寫一個(gè) c,寫一個(gè) c++ ? 應(yīng)用程序|編程| Anjuta IDE ? 新建工程,用向?qū)梢粋€(gè) C程序的框架,你在Visual C++一樣,頓時(shí)生成許多文件,用 IDE就是這樣麻煩。 ? 選擇 C標(biāo)簽頁(yè)下的 Generic ? 工程名用默認(rèn)的 foobarsample ? 在 optional下全部選擇:無(wú) ? 生成目的地為:主文件夾: zhouxiongfei 之下新建一個(gè)文件夾: test Linux操作系統(tǒng) ? 在 Anjuta左邊文件目錄中,打開 src文件夾,看到有個(gè) ,打開它,可以看到向?qū)б呀?jīng)為我們生成了一個(gè) c程序: /* * Mode: C。 indenttabsmode: t。 cbasicoffset: 4。 tabwidth: 4 * */ /* * * Copyright (C) 周雄飛 2022 * * is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or * (at your option) any later version. Linux操作系統(tǒng) * is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY。 without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see */ include int main() { printf(Hello world\n)。 return (0)。 } 按 shift+F11生成工程(對(duì)應(yīng)于: 生成|生成工程) 按 F3(對(duì)應(yīng)于: run|執(zhí)行程序(需要選擇要運(yùn)行是那個(gè)程序)就可以在終端運(yùn)行了 Linux操作系統(tǒng) Linux操作系統(tǒng) Linux操作系統(tǒng) Linux操作系統(tǒng) Linux操作系統(tǒng) 信息科學(xué)與技術(shù)學(xué)院