C C 原始碼編譯警示錄

2021-06-17 20:44:30 字數 1652 閱讀 3037

哎喲,扯遠了,回到正題……因為我們現在有太多可用的**,我們不用從頭編寫,而要做的大部分工作都是移植(更專業點的叫重構),這裡將持續地將自己移植工程(主要是c/c++工程)中遇到的問題及解決過程記錄下來,「掘地三尺非一日之功」,這是乙個積累的過程。

1. 出現大量的 link error #10056: symbol "_fann_set_scaling_params" redefined

【情況】

在鏈結乙個神經網路的c語言庫fann時,出現大量的類似上面redefined錯誤,

錯誤原因很明顯,

「_fann_set_scaling_params重複定義

」,而我在工程裡找遍了,發先確實都只在一處有定義。

【解釋】

_fann_set_scaling_params是編譯後.obj檔案中的識別符號號(symbol,一般這些符號開頭帶下劃線),以上錯誤出現在鏈結的時候,這說明多個.obj檔案中出現了_fann_set_scaling_params的定義。我們知道,c編譯器是根據.c檔案編譯的(即乙個.c檔案生成乙個.obj,c編譯器不會主動去編譯標頭檔案)。而fann庫有所不同,其中乙個floatfann.c檔案中有這樣幾行**:

#include "fann.c"

#include "fann_io.c"

#include "fann_train.c"

#include "fann_train_data.c"

#include "fann_error.c"

#include "fann_cascade.c"

你沒看錯,c語言中也是可以包含.c檔案的,包含的.c檔案會當做共成檔案也編譯成.obj檔案。這就明白了,我將上面包含的幾個.c檔案新增到了工程裡面,而這裡又包含了這幾個.c檔案,同乙個.c檔案編譯了兩次,當然會出現重複定義了。

【解決辦法】

第一種方法,將上面使用include包含的.c檔案從工程中移除,第二種方法,將上面的#include "**.c"注釋掉,相應的原始檔新增到工程中。

注:這是第乙個問題,記得之前遇到過很多次類似的問題,每次都迷迷糊糊的弄了好久才解決,甚至程式編譯通過後還迷迷糊糊不知道怎麼就跑通了,真後悔沒早作記錄。這次在往dsp上移植fann時又遇到這個問題,謹記。

2. fatal error #5: could not open source file "fann.h"

【解釋】

相對於上面的編譯錯誤,這是鏈結錯誤,意思是說fann.h標頭檔案打不開,要麼壓根就沒有這個標頭檔案(檢查下頭檔名有沒有錯誤),要麼就是標頭檔案路徑設定不對(編譯器找到不標頭檔案)。

【解決方法】

在確定有這個標頭檔案的情況下,eclipse c/c++中解決問題的方法是,工程右鍵->properities->build->compiler->include options,在-i選項中新增標頭檔案所在目錄。關於這一點,用過linux下gcc編譯器的就會對頭檔案搜尋路徑,庫搜尋路徑這些內容特別敏感,因此,這裡強烈推薦做軟體(尤其是c/c++軟體)的要學會gcc的使用,這對學會構建工程非常有用。

3. warning:  #231-d: declaration is not visible outside of function

【解釋】

沒有包含相關的標頭檔案,將相關標頭檔案包含就ok了

待增加中……

C C 原始碼編譯警示錄

哎喲,扯遠了,回到正題 因為我們現在有太多可用的 我們不用從頭編寫,而要做的大部分工作都是移植 更專業點的叫重構 這裡將持續地將自己移植工程 主要是c c 工程 中遇到的問題及解決過程記錄下來,掘地三尺非一日之功 這是乙個積累的過程。1.出現大量的 linkerror 10056 symbol fa...

警示錄 被上司看重的18個重要細節

職場競爭慘烈,如何穩操勝券,讓你的崗位無人可以取代?如果你能避免以下自找失敗的蠢事,你就能在激烈的競爭中,做個讓老闆無法不用你的人。1 工作時間不要與同事喋喋不休,這樣做只能造成兩個影響,一是那個喋喋不休的人覺得你也很清閒,二是別的人覺得你倆都很清閒。2 不要在老闆不在的時間偷懶,因為你手頭被打了折...

手動編譯原始碼安裝mysql 原始碼編譯安裝mysql

1 安裝mysql需要的依賴包 yum y install ncurses devel libaio devel 2 安裝編譯mysql需要的軟體 mysql 有3個版本分支 5.0 5.1系列 5.4 5.7系列 6.0 7.1群集產品系列 最早的mysql 5.0 5.1產品 直接.config...