乙個GCC4 6 3的奇妙問題的糊塗解決方案

2021-06-17 20:33:55 字數 2749 閱讀 4797

因為工作中需要opencv,又不想用windows,所以我就在linux下編譯安裝opencv了。一開始,由於我的計算機不能安裝ubuntu12.04,所以我安裝了ubuntu13.04,opencv的環境也配置的很順利。

在13.04上安裝完成opencv後,我便興沖沖的實驗了一把,其實我的程式什麼也沒有做,只是新增了包含了opencv的標頭檔案而已。然後我就編譯呀。

// file : test.c

#include #include #include int main()

編譯命令:

$ gcc -c test.c 

$ gcc test.o -o test

結果就輸出了一堆如下的資訊:

test.o:test.c:function cvdecrefdata: error: undefined reference to 'cvfree_'

test.o:test.c:function cvdecrefdata: error: undefined reference to 'cvfree_'

test.o:test.c:function cvgetrow: error: undefined reference to 'cvgetrows'

test.o:test.c:function cvgetcol: error: undefined reference to 'cvgetcols'

test.o:test.c:function cvreleasema***: error: undefined reference to 'cvreleasemat'

test.o:test.c:function cvsubs: error: undefined reference to 'cvadds'

test.o:test.c:function cvcloneseq: error: undefined reference to 'cvseqslice'

test.o:test.c:function cvsetnew: error: undefined reference to 'cvsetadd'

test.o:test.c:function cvgetsetelem: error: undefined reference to 'cvgetseqelem'

test.o:test.c:function cvellipsebox: error: undefined reference to 'cvellipse'

test.o:test.c:function cvfont: error: undefined reference to 'cvinitfont'

test.o:test.c:function cvreadintbyname: error: undefined reference to 'cvgetfilenodebyname'

test.o:test.c:function cvreadrealbyname: error: undefined reference to 'cvgetfilenodebyname'

test.o:test.c:function cvreadstringbyname: error: undefined reference to 'cvgetfilenodebyname'

test.o:test.c:function cvreadbyname: error: undefined reference to 'cvgetfilenodebyname'

test.o:test.c:function cvreadbyname: error: undefined reference to 'cvread'

test.o:test.c:function cvcontourperimeter: error: undefined reference to 'cvarclength'

test.o:test.c:function cvcalchist: error: undefined reference to 'cvcalcarrhist'

collect2: error: ld returned 1 exit status

我就納悶了呀,我的程式裡只是包含了標頭檔案啊,怎麼會使用opencv的函式呢,所以每必要產生這麼多對opencv庫函式的依賴呀!

於是,我看了看編譯時產生的彙編**,看看是否有啥蹊蹺。

gcc -s test.c

開啟test.s檔案,看看,果然又很多opencv的庫函式呢。於是我就開始新增opencv的庫。最後就這樣解決了。

$ gcc test.o -o test -lopencv_core -l/usr/local/lib -lopencv_highgui

跟在13.04下差不多的情況,按照上面的過程就可以解決了。

正當我為解決了這個問題高興的時候,我遇到了新的問題。

一般我習慣把輸入檔案放到編譯命令的最後,結果這樣照樣會出現問題。

出現問題的編譯命令是:

$ gcc  -o test -lopencv_core -l/usr/local/lib -lopencv_imgproc test.o

我發現只要把test.o放到-l..這些選項的前面,就不會出現函式未定義的問題。

就這樣算解決了把。以前我也遇到過由於鏈結庫的位置不對而導致鏈結不正確的情況,看來編譯器還不是那麼智慧型啊,以後要小心了。

租房了,說乙個奇妙的事情。

不知不覺,一年了,換房了,當然這裡一切都變好了。房東就要加價了,也許這房並不像正常居室那般,空間卻是足的,像是旅館,你在裡面呆了去,久了,人畢竟是有感情的,就不想離開。可是我已經呆了好久了,那麼既然大家沒達成共識,就好聚好散了!於是我換了,地方就幾步,租在別人家。剩下的,那個屋子房東應該是可以租給更...

更新CentOS安裝gcc遇到的乙個問題

更新centos安裝gcc遇到的乙個問題 起因是在乙個trixbox上安裝gcc 第一步,更新系統的軟體包到最新 yum y update 漫長的等待過後,reboot,然後再次執行了 yum y update 確認再沒有可更新的模組了。接下來,安裝gcc yum y install gcc 沒想到...

GCC靜態庫的另乙個問題

對於c 生成的靜態庫,按照一般的想法去鏈結,會出現所有的符號都無法找到的錯誤。這裡所謂的一般的想法就是把原始檔放在最後邊,如 g o test.exe l l t test.cpp,那麼得到的錯誤資訊為 test.cpp text 0x31 undefined reference to t test...