2015-02-09 82 views
3

我正在爲C++庫(ITK)創建一個外部模塊,我正在用cmake和make(我在Ubuntu VM上)構建它。爲什麼當我鏈接到一個庫時會出錯,但是當我構建它時不會出錯?

假設代碼中存在錯誤,例如重新定義方法。在這種情況下,該庫與cmake ../src && make && sudo make install構建時沒有錯誤,但是當我嘗試將某個項目鏈接到庫時出現錯誤。

爲什麼錯誤不會停止庫的構建? make的行爲有所不同,這些情況是否有根本性的不同?我對C++(以及一般的編譯語言)相當陌生 - 我想有一些關於構建過程的基礎知識,我並不瞭解。我發現很難搜索這個 - 搜索「C++庫沒有編譯錯誤」給了我很多關於C++庫編譯錯誤的線程。

+0

你在鏈接時得到的是什麼錯誤? – 2015-02-09 12:35:55

+0

那麼,在方法重定義的例子中,類似'error:redefinition o f'void itk :: PhaseDerivativeVarianceImageFilter :: PrintSelf(std :: ostream&,itk :: Indent)const'' – 2015-02-09 12:37:18

+0

一般我明白這些錯誤來自哪裏,一旦我得到它們 - 我只是不理解編譯器在編譯庫時爲什麼不選擇它們。 – 2015-02-09 12:38:03

回答

1

一般來說,庫只是編譯代碼 - 對象文件的集合。通常,只有在創建可執行文件時,鏈接器纔會嘗試確保可執行文件中使用的所有符號可以通過鏈接的庫來解析,因此您將看到鏈接錯誤。

如果一個符號(函數,常數等)的定義或者不能找到或是不明確的(即,可以在一個以上的地方找到,則鏈接失敗。

+0

謝謝 - 我認爲我不瞭解的基本原理是,在構建庫時,它會分別查看每個「對象」(如方法定義),而不會嘗試將它們彼此關聯。所以如果我有一個普通的無效C++(比如一個流浪的反斜槓或者其他東西),我會得到一個錯誤。這現在有道理。 – 2015-02-09 14:10:16

1

雖然聯,它檢查橫 - 引用,符號(函數,標識符等)定義和調用或使用被綁定到靜態鏈接中(動態鏈接是不同的,因爲這是延遲鏈接,因此交叉引用可能不會完成)庫是一個簡單的函數或標識定義集合,不會做交叉引用

相關問題