2013-01-07 66 views
1

我想將一些網絡代碼包含到我的C++應用程序中。我下載了CSimpleSocket,並將所有.h和.cpp文件複製到我的主文件所在的目錄中。然後我試圖包括標題中的一個,但所述接頭只是barfs了一堆錯誤的,如:在我的C++應用程序中包含第三方代碼的問題

  • [連接子錯誤]未定義參考CPassiveSocket :: CPassiveSocket(CSimpleSocket :: CSocketType)」
  • [鏈接器錯誤]未定義參考`CSimpleSocket ::初始化() '
  • [接頭錯誤]未定義參考`CPassiveSocket ::聽(無符號字符常量*,短型,整型)'
  • [接頭錯誤]未定義參考`CPassiveSocket ::接受()」

等。一切都在一個目錄中,所以我不認爲這是問題。我正在使用的代碼包括#include "PassiveSocket.h"。如果這有什麼不同,我正在使用Dev-C++。我不明白我做錯了什麼,所以如果有人能幫助我,那會很好。

原諒我,如果這是一個非常愚蠢的問題,但我想學C++,這是不容易的。謝謝你的幫助。

回答

4

你得到這個錯誤的原因是因爲你的編譯器無法找到對應於CSimpleSocket頭二進制文件。這就好像你寫了

void someFunction(int someArg); 

然後從來沒有提供someFunction的實現。

要使用第三方庫,你需要兩樣東西:

  • 頭文件(.H,.HPP等)
  • 庫文件(.A,.LIB等。 )

一旦你得到了你的頭文件和庫文件,你需要把它們放在你的編譯器可以找到它們的地方。這個地方會根據您的操作系統,環境變量和編譯器配置而有所不同。

現在,他們是在某處編譯器可以找到它們,你需要告訴編譯器使用它們。頭文件與#include命令一起使用,並且庫文件通過向編譯器提供參數進行鏈接。

幕後Dev-C++使用MinGW GNU GCC編譯器,它調用類似於g++ file1.cpp file2.cpp ... filen.cpp -o filename的命令,該命令告訴程序g ++使用文件1至n編譯名爲「filename」的C++可執行文件。還有其他可以添加到g ++的標誌,例如告訴它在哪裏搜索以及鏈接什麼。

CSimpleSocket庫在編譯時的名稱是「clsocket」,因此我們需要找到一種方法來配置Dev-C++以將-lclsocket添加到g++命令。我不使用Dev-C++,因此我無法在此幫助您,但您可能正在尋找「鏈接選項」或類似的編譯配置。您還需要確保.lib和.h文件位於搜索路徑中,該路徑也應該可以在Dev-C++中配置。

CSimpleSocket還提供了一個安裝程序,會自動創建的.lib文件並將.LIB和地方的.h在那裏他們可以找到,你應該考慮使用該安裝程序。

我認爲這個答案的複雜性突出了C++庫集成生態系統的糟糕狀態。不幸的是,在撰寫本文時,C++中沒有「模塊」的概念。

+0

謝謝你的回答,這對我很重要。 好的,所以我安裝了CSimpleSocket,向鏈接器添加了-lclsocket,並將這些文件的路徑添加到編譯器搜索路徑中。我很確定我做得正確。如果我拿出所有的代碼,只留下include語句,一切都編譯好。但是當我創建一個對象時,鏈接器會像以前一樣提供所有相同的錯誤。 – thePurpleMonkey

+0

有時IDE會自動添加-l,所以你實際上可能會鏈接-l-lclsocket,試着在配置中添加clsocket。 –

+0

我不認爲就是這樣。當我擺脫了-l我得到這個錯誤:'[Build Error] [Server.exe] Error 1' – thePurpleMonkey

相關問題