gcc的幾個(gè)妙用
下面的代碼如下:
- foo.c
- 1 #include
- 2
- 3
- 4 extern void bar();
- 5
- 6 void foo()
- 7{
- 8 printf("This is foo ().");
- 9
- 10 bar();
- 11}
bar.c
本文引用地址:http://www.ex-cimer.com/article/201612/324540.htm 1 #include
2
3 void bar()
4 {
5 printf( " This is bar (). ");
6 }
7
main.c
1 extern void foo();
2
3 int main()
4 {
5 foo();
6
7 return 0;
8 }
~
簡(jiǎn)要的介紹一些靜態(tài)庫(kù)的創(chuàng)建方式。
首先需要注意的時(shí)靜態(tài)編譯是指將一些庫(kù)函數(shù)編譯到程序中,這樣會(huì)增加程序的大小。動(dòng)態(tài)庫(kù)則是在運(yùn)行過(guò)程中添加到程序中,這樣可以減小程序的大小。兩種方式都有各自的優(yōu)勢(shì)。
靜態(tài)庫(kù)的創(chuàng)建:
gcc -c foo.c -o foo.o
gcc -c bar.c -o bar.o
創(chuàng)建的基本過(guò)程就是采用歸檔函數(shù)實(shí)現(xiàn)。
ar csr libfoo.a foo.o
ar csr libbar.a bar.o
從上面的程序我們可以知道foo程序依賴bar程序,而main程序則依賴foo程序,所以這樣就形成了一定的關(guān)系,一般來(lái)說(shuō)只有將依賴的庫(kù)函數(shù)寫在最右邊才能保證其他的庫(kù)函數(shù)依賴該庫(kù)函數(shù)。
[gong@Gong-Computer test]$ gcc -o main main.c -L. -lbar -lfoo
./libfoo.a(foo.o): In function `foo:
foo.c:(.text+0x13): undefined reference to `bar
collect2: ld returned 1 exit status
./libfoo.a(foo.o): In function `foo:
foo.c:(.text+0x13): undefined reference to `bar
collect2: ld returned 1 exit status
[gong@Gong-Computer test]$ gcc -o main main.c -L. -lfoo -lbar
以上的兩個(gè)編譯過(guò)程只是存在一個(gè)差異就是庫(kù)的擺放順序存在差別,第一種情況下由于foo依賴bar,而bar庫(kù)不能被foo調(diào)用,因此出錯(cuò)。而第二種則滿足foo依賴bar,main依賴foo的關(guān)系。其中的-L.表示庫(kù)函數(shù)的搜索目錄為當(dāng)前目錄。也可以換成其他的目錄。
以上的兩個(gè)編譯過(guò)程只是存在一個(gè)差異就是庫(kù)的擺放順序存在差別,第一種情況下由于foo依賴bar,而bar庫(kù)不能被foo調(diào)用,因此出錯(cuò)。而第二種則滿足foo依賴bar,main依賴foo的關(guān)系。其中的-L.表示庫(kù)函數(shù)的搜索目錄為當(dāng)前目錄。也可以換成其他的目錄。
因此在gcc中添加庫(kù)時(shí),需要注意庫(kù)名和庫(kù)的順序,最好采用一定的依賴關(guān)系圖分析實(shí)現(xiàn)。具體的就要我們?cè)谠O(shè)計(jì)程序時(shí)自己的考慮各個(gè)庫(kù)函數(shù)之間的關(guān)系。
至于動(dòng)態(tài)庫(kù)的創(chuàng)建可以采用gcc實(shí)現(xiàn)。其中的-shared就是表明了該庫(kù)是動(dòng)態(tài)庫(kù),-fPCI是指支持PCI,file.o是指需要加載到庫(kù)中的二進(jìn)制文件。庫(kù)名就是libname.so
gcc -shared -fPCI -o libname.so file.o
動(dòng)態(tài)庫(kù)的使用可以將創(chuàng)建好的動(dòng)態(tài)庫(kù)放在/usr/lib下,然后在函數(shù)中即可實(shí)現(xiàn)調(diào)用。
動(dòng)態(tài)庫(kù)的使用可以將創(chuàng)建好的動(dòng)態(tài)庫(kù)放在/usr/lib下,然后在函數(shù)中即可實(shí)現(xiàn)調(diào)用。
gcc的其他一些用法:
查找系統(tǒng)文件路徑:gcc -v main.c
獲得程序的依賴關(guān)系:gcc -M main.c ,其中包括了所有的依賴關(guān)系,在寫makefile過(guò)程中寫依賴關(guān)系通常不需要系統(tǒng)頭文件,這時(shí)可以采用gcc -MM main.c去掉系統(tǒng)頭文件的依賴關(guān)系。
看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人
(function(){
var bp = document.createElement('script');
var curProtocol = window.location.protocol.split(':')[0];
if (curProtocol === 'https') {
bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
}
else {
bp.src = 'http://push.zhanzhang.baidu.com/push.js';
}
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(bp, s);
})();
- [gong@Gong-Computer test]$gcc-M main.c
- main.o:main.c/usr/include/stdio.h/usr/include/features.h
- /usr/include/sys/cdefs.h/usr/include/bits/wordsize.h
- /usr/include/gnu/stubs.h/usr/include/gnu/stubs-32.h
- /usr/lib/gcc/i686-redhat-linux/4.5.1/include/stddef.h
- /usr/include/bits/types.h/usr/include/bits/typesizes.h
- /usr/include/libio.h/usr/include/_G_config.h/usr/include/wchar.h
- /usr/lib/gcc/i686-redhat-linux/4.5.1/include/stdarg.h
- /usr/include/bits/stdio_lim.h/usr/include/bits/sys_errlist.h
- [gong@Gong-Computer test]$gcc-MM main.c
- main.o:main.c
- [gong@Gong-Computer test]$
從上面的兩個(gè)結(jié)果就可以知道兩個(gè)選項(xiàng)的差別,這種差別在編寫Makefile中的依賴關(guān)系時(shí)非常的有用。特別是第二種形式是比較重要的方式。
關(guān)于gcc的使用還是要多實(shí)踐才有效果,才能準(zhǔn)確的運(yùn)用。
關(guān)鍵詞:
gcclinux編譯工
相關(guān)推薦
技術(shù)專區(qū)
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機(jī)
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線
- 開關(guān)電源
- 單片機(jī)
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩(wěn)壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機(jī)控制
- 藍(lán)牙
- PLC
- PWM
- 汽車電子
- 轉(zhuǎn)換器
- 電源管理
- 信號(hào)放大器
評(píng)論