編輯的時候因為融合了很多文件,主要是.c文件和.h文件,因為一個.c文件包括很多.h文件.這里面很可能出現(xiàn)重定義的問題,報錯的話都是這么報的.多次聲明不會報錯其實我在兩個文件中分別 int i; 不會報錯file1: int i = 9;file2:int i;也不會報錯file1: int i = 9;file2:int i = 8;報錯linux@ubuntu:~/testForEVERYTHING$ gcc -S main.c -o main.o
In file included from main.c:9:0:
function2.h:8:5: error: redefinition of ‘i’
function1.h:8:5: note: previous definition of ‘i’ was here這是我故意做的,當然現(xiàn)實情況下不會這么簡單地出錯.
3/匯編
匯編是按照編譯后的文件轉(zhuǎn)二進制的,只要是編譯沒問題,匯編就沒問題
4/鏈接
鏈接的時候要根據(jù)調(diào)用文件中的函數(shù)引用 找到 目標文件或者共享目標文件中的原型.有多少個文件就從多少個文件中找,一個文件中有多少個就找多少個.linux@ubuntu:~/testForEVERYTHING$ gcc function1.o function2.o main.o -o main
function2.o: In function `fun':
function2.c:(.text+0x0): multiple definition of `fun'
function1.o:function1.c:(.text+0x0): first defined here
collect2: ld returned 1exit status意思是在 function2.o 中,有一個 fun 函數(shù) ,fun函數(shù)在文件 function2.c中,多重定義然而說function1.o中的是第一次定義,為什么會出現(xiàn)這種情況呢? 原因是先連接的前面的linux@ubuntu:~/testForEVERYTHING$ gcc function2.o function1.o main.o -o main
function1.o: In function `fun':
function1.c:(.text+0x0): multiple definition of `fun'
function2.o:function2.c:(.text+0x0): first defined here
collect2: ld returned 1exit status當然,這是我人為故意鏈接了多個
編譯實例分析
出現(xiàn)編譯時重定義的時候非常多,尤其是在編譯第三方源碼的時候在我編譯busybox(busybox-1.17.3.tar.bz2)的時候出現(xiàn)了這個問題:In file included from /usr/include/linux/sysctl.h:25:0,from /usr/include/linux/netfilter.h:6,from /usr/include/linux/netfilter_ipv4.h:8,from networking/tcpudp.c:35:
/usr/include/linux/kernel.h:12:8: error: redefinition of ‘struct sysinfo’
include/libbb.h:107:8: note: originally defined here
make[1]: *** [networking/tcpudp.o] Error 1
make: *** [networking] Error 2這個意思是在將networking/tcpudp.c編譯成networking/tcpudp.o的時候,出現(xiàn)了一個問題這個問題是編譯的時候 一開始 在 include/libbb.h 中聲明(我一般稱之為聲明)了一個struct sysinfo 這樣的結(jié)構(gòu)體類型,然后/usr/include/linux/kernel.h文件中也聲明了一個這樣的類型具體是這么包含的(下面這一段是我分析源碼得到的,我不知道是不是可以根據(jù)log分析出來,因為沒有其他問題的log供我分析)networking/tcpudp.c包含了include/libbb.h 和 /usr/include/linux/netfilter_ipv4.h
/usr/include/linux/netfilter_ipv4.h包含了/usr/include/linux/netfilter.h
/usr/include/linux/netfilter.h包含了/usr/include/linux/sysctl.h
/usr/include/linux/sysctl.h包含了/usr/include/linux/kernel.h
也就是說
networking/tcpudp.c包含了include/libbb.h,間接包含了/usr/include/linux/kernel.h
然而,這兩個.h文件中都有同一個聲明,預(yù)處理的時候都弄到同一個文件里了,所以出現(xiàn)了重定義的問題解決方案:
將/usr/include/linux/sysctl.h文件中包的/usr/include/linux/kernel.h這個刪除掉,并添加一個include/libbb.h
------------------------------1
In file included from 2.h:8:0,from main.c:11:
22.h:8:5: error: redefinition of ‘i’int i = 10;^
In file included from 1.h:8:0,from main.c:10:
11.h:8:5: note: previous definition of ‘i’ was hereint i = 9;^
------------------------------2
In file included from main.c:11:0:
2.h:8:5: error: redefinition of ‘i’int i = 10;^
In file included from 1.h:8:0,from main.c:10:
11.h:8:5: note: previous definition of ‘i’ was hereint i = 9;^
------------------------------3
main.c:13:5: error: redefinition of ‘i’int i = 10;^
In file included from 1.h:8:0,from main.c:10:
11.h:8:5: note: previous definition of ‘i’ was hereint i = 9;^
----------------------------------------------------
編譯問題
第1個示例中的 一個 i 定義在 22.h 中,另一個 i 定義在 11.h 中
第2個示例中的 一個 i 定義在 2.h 中,另一個 i 定義在 11.h 中
第3個示例中的 一個 i 定義在 main.c 中,另一個 i 定義在 11.h 中
----------------------------------------------------function1.o: In function `fun':
function1.c:(.text+0x0): multiple definition of `fun'
function2.o:function2.c:(.text+0x0): first defined here
collect2: ld returned 1exit status
----------------------------------------------------
連接問題
編譯成function1.o 的 function1.c 中 有 fun 的定義
編譯成function2.o 的 function2.c 中 有 fun 的定義
----------------------------------------------------
In file included from /usr/include/linux/sysctl.h:25:0,from /usr/include/linux/netfilter.h:6,from /usr/include/linux/netfilter_ipv4.h:8,from networking/tcpudp.c:35:
/usr/include/linux/kernel.h:12:8: error: redefinition of ‘struct sysinfo’
include/libbb.h:107:8: note: originally defined here
make[1]: *** [networking/tcpudp.o] Error 1
make: *** [networking] Error 2
----------------------------------------------------
編譯問題
編譯成 networking/tcpudp.o 的 networking/tcpudp.c 中包含的 include/libbb.h 聲明了 struct sysinfo
編譯成 networking/tcpudp.o 的 networking/tcpudp.c 中包含的 /usr/include/linux/netfilter_ipv4.h 包含的
/usr/include/linux/netfilter.h 包含的 /usr/include/linux/sysctl.h 包含的 /usr/include/linux/kernel.h 聲明了 struct sysinfo
----------------------------------------------------