Linux下GCC的安装,GCC链接外部库
GCC的安裝
環(huán)境RedHatLinuxAS5
安裝盤:RedHatLinuxAS5正式版DVD.iso
查看gcc版本:
# gcc -v
檢查是否安裝rpm包
# rpm -qa | grep rpm_name
# rpm -qa | grep gcc
加載:
# mkdir /mnt/cdrom
# mount /dev/cdrom /mnt/cdrom/
卸載:
# umount /mnt/cdrom/
進入cdrom,查找gcc安裝包。在Server目錄下
# cd /mnt/cdrom/
# find -iname gcc*
安裝gcc:
# rpm -ivh Server/gcc-4.1.1-52.el5.i386.rpm
warning: Server/gcc-4.1.1-52.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
error: Failed dependencies:
??????? glibc-devel >= 2.2.90-12 is needed by gcc-4.1.1-52.el5.i386
??????? libgomp = 4.1.1-52.el5 is needed by gcc-4.1.1-52.el5.i386
??????? libgomp.so.1 is needed by gcc-4.1.1-52.el5.i386
先安裝所依賴的包。
# rpm -ivh Server/glibc-headers-2.5-12.i386.rpm
# rpm -ivh Server/glibc-devel-2.5-12.i386.rpm
# rpm -ivh Server/libgomp-4.1.1-52.el5.i386.rpm
再# rpm -ivh Server/gcc-4.1.1-52.el5.i386.rpm
安裝gcc-c++:
# rpm -ivh Server/libstdc++-devel-4.1.1-52.el5.i386.rpm
# rpm -ivh Server/gcc-c++-4.1.1-52.el5.i386.rpm
安裝gdb:
# rpm -ivh Server/gdb-6.5-16.el5.i386.rpm
查看RPM包安裝路徑:
rpm -ql rpm_name
==========================
?
GCC的使用
Hello World
#include <stdio.h> int main(void) {printf("Hello, world.\n");return 0; }
保存成main.c,然后編譯執(zhí)行:
$ gcc main.c
$ ./a.out
Hello, world.
如果不想把文件名叫a.out,可以用gcc的-o參數(shù)自己指定文件名:
$ gcc main.c -o main
打開gcc的-Wall選項,也就是讓gcc提示所有的警告信息,不管是嚴重的還是不嚴重的。
$ gcc -Wall main.c
==========================
?
鏈接外部庫
庫是預(yù)編譯的目標文件(object files)的集合,它們可被鏈接進程序。靜態(tài)庫以后綴為‘.a’的特殊的存檔文件(archive file)存儲。標準系統(tǒng)庫可在目錄 /usr/lib 與 /lib 中找到。比如,在類 Unix 系統(tǒng)中 C 語言的數(shù)學(xué)庫一般存儲為文件 /usr/lib/libm.a。該庫中函數(shù)的原型聲明在頭文件 /usr/include/math.h 中。C 標準庫本身存儲為 /usr/lib/libc.a,它包含 ANSI/ISO C 標準指定的函數(shù),比如‘printf’。對每一個 C 程序來說,libc.a 都默認被鏈接。
調(diào)用數(shù)學(xué)庫 libm.a 中 sqrt 函數(shù)的的例子:
math.c
# gcc -Wall math.c /usr/lib/libm.a -o math
# ./math
The value of sqrt(4.0) is 2.000000
如果不 加上/usr/lib/libm.a 會報錯, 提示沒有定義sqrt
因為函數(shù) sqrt,未在本程序中定義也不在默認庫‘libc.a’中;除非被指定,編譯器也不會鏈接‘libm.a’。
為使編譯器能將 sqrt 鏈接進主程序‘math.c’,我們需要提供數(shù)學(xué)庫‘libm.a’。一個容易想到但比較麻煩的做法是在命令行中顯式地指定它,即像上面那樣。函數(shù)庫‘libm.a’包含所有數(shù)學(xué)函數(shù)的目標文件,比如sin,cos,exp,log及sqrt。鏈接器將搜索所有文件來找到包含sqrt的目標文件。
一旦包含 sqrt 的目標文件被找到,主程序就能被鏈接,一個完整的可執(zhí)行文件就可生成了.
可執(zhí)行文件包含主城許的機器碼以及函數(shù)庫‘libm.a’中sqrt 對應(yīng)的機器碼。
為避免在命令行中指定長長的路徑,編譯器為鏈接函數(shù)庫提供了快捷的選項‘-l’。例如,下面的命令
代碼:
# gcc -Wall math.c -lm -o math????? /*與 gcc -Wall math.c -lm -o math是樣的效果*/
一般來說,選項 -lNAME使鏈接器嘗試鏈接系統(tǒng)庫目錄中的函數(shù)庫文件 libNAME.a。一個大型的程序通常要使用很多 -l 選項來指定要鏈接的數(shù)學(xué)庫,圖形庫,網(wǎng)絡(luò)庫等。
轉(zhuǎn)載于:https://www.cnblogs.com/rbotao/archive/2010/06/23/1763042.html
總結(jié)
以上是生活随笔為你收集整理的Linux下GCC的安装,GCC链接外部库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用rman创建standby(一)(转
- 下一篇: .Net中DataTable的保存