2012-03-13 62 views
2

這是我再次。我回來了一個全新的項目和一個全新的問題。 我正在努力爲Growl實現一些東西。使用靜態或共享庫(均提供)。我包括必要的標題並鏈接到圖書館。 (實際上有兩種方法,一種通過項目屬性,另一種通過雜注語句)。然而,IM仍在接收下面的鏈接器錯誤:圖書館鏈接器錯誤讓我生氣

error LNK2001: unresolved external symbol "__declspec(dllimport) public: __thiscall Growl::Growl(enum Growl_Protocol,char const * const,char const * const,char const * * const,int)" ([email protected]@[email protected][email protected]@[email protected]) 
error LNK2001: unresolved external symbol "__declspec(dllimport) public: __thiscall Growl::~Growl(void)" ([email protected]@[email protected]) 
fatal error LNK1120: 2 unresolved externals 

的是導致這些鏈接器錯誤代碼的行是這樣的線:

const char *n[2] = { "username" , "password" }; 
Growl *growl = new Growl(GROWL_TCP,NULL, "Appname", (const char **const)n,2); 

頭文件被包含在文件的頂部

#include "..\\..\\..\\libs\\Growl\\growl++.hpp" 
#pragma comment(lib, "..\\..\\..\\libs\\Growl\\libgrowl-static++.lib") 

頭源可以在這裏找到: https://github.com/psinnott/gntp-send/blob/master/headers/growl%2B%2B.hpp

,我用下面的連接線

我取回預先生成的二進制文件從以下頁面: https://github.com/psinnott/gntp-send/wiki/Windows

一些額外的信息:我有我的項目化子性質字符集使用多字節字符集,即時通訊的假設下,這應該不會影響任何東西。這也是一個Win32控制檯應用程序。

我哪裏錯了?

更新:
通過谷歌發現這一點: http://groups.google.com/group/growl-for-windows/browse_thread/thread/6c48a62454d062f1

跟着指示:
添加了libgrowlstatic.lib(並排libgrowlstatiC++ IIb)的
添加預處理器定義,GROWL_STATICGROWL_CPP_STATIC

有很多錯誤,包括:

LINK : warning LNK4098: defaultlib 'MSVCRTD' conflicts with use of other libs; use /NODEFAULTLIB:library 
LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library 
fatal error LNK1169: one or more multiply defined symbols found 

所以我增加了以下線項目屬性,鏈接器,命令行:

/NODEFAULTLIB:MSVCRTD /NODEFAULTLIB:LIBCMT 

現在即時得到很多更多的錯誤,包括以下一些:

libgrowl-static.lib(tcp.obj) : error LNK2019: unresolved external symbol _atoi referenced in function _growl_tcp_parse_hostname 
libgrowl-static.lib(tcp.obj) : error LNK2019: unresolved external symbol _strchr referenced in function _growl_tcp_parse_hostname 
libgrowl-static.lib(growl-static.obj) : error LNK2019: unresolved external symbol _fseek referenced in function _growl_tcp_register 
libgrowl-static.lib(growl-static.obj) : error LNK2019: unresolved external symbol _fopen referenced in function _growl_tcp_register 
libgrowl-static.lib(growl-static.obj) : error LNK2019: unresolved external symbol _strcpy referenced in function _growl_udp_notify 

去過在這幾個小時,似乎無法弄清楚。 10多個意見,沒有回覆? 我發誓我不懶惰。我研究了一些關於圖書館的答案,但沒有多少運氣。沒有任何解釋爲什麼這是行事的方式。請幫忙!

+0

歡迎回來,李維斯,我們都非常想念你:-) – paxdiablo 2012-03-13 03:53:48

+0

嘿嘿。謝謝Pax。 =) – 2012-03-13 03:57:56

+0

鏈接器正在尋找導出的函數,但您似乎提供了一個靜態庫,而不是一個導入庫。 – 2012-03-13 03:59:16

回答

1

這是爲我工作。它假定你想使用靜態庫而不是dll。

屬性 - >配置 - >屬性 - > VC++目錄

Add directory of unzipped sdk to include and library directories 

屬性 - >配置 - >屬性 - > C/C++ - >預處理器

Add GROWL_STATIC and GROWL_CPP_STATIC to preprocessor definitions 

屬性 - >配置 - >屬性 - > C/C++ - >代碼生成

Change runtime library to multi threaded (/MT or /MTd) 

屬性 - >配置 - >屬性 - >鏈接器 - >輸入

Add ws2_32.lib , libgrowl-static.lib and libgrowl-static++.lib to additional dependencies 
+0

昨天我用Hans Passant的答案解釋了這一點。我選擇你的答案作爲最佳答案,因爲它更清楚。你的答案正是我必須做的才能讓它工作! – 2012-03-14 13:03:41

2
#pragma comment(lib, "..\\..\\..\\libs\\Growl\\libgrowl-static++.lib") 

#pragma和您的代碼編譯方式之間存在明顯的不匹配。圖書館的名稱強烈建議這是一個靜態鏈接庫,名稱中的「靜態」表示清楚。然而,錯誤消息討論了__declspec(dllimport),這是一個在編譯代碼時使用的指令,這些代碼包含一個假設代碼存在於DLL而非靜態鏈接庫中的頭文件。

你正在得到的其他錯誤也承擔了這一點。項目+屬性,C/C++,代碼生成,運行時庫設置很重要。您正在使用/ MD設置,這是在使用DLL時適合的設置。毫無疑問,庫是用/ MT編譯的,當你創建一個不使用DLL的單片EXE時,這個設置是合適的。您試圖鏈接兩個使用衝突設置構建的代碼塊,鏈接器在嘗試處理這個時遇到了問題。它在錯誤信息中明確表示。

您需要挖掘.lib的DLL版本或者在代碼的其餘部分一致地使用/ MT。通常有一個#define告訴.h文件你打算鏈接哪個版本的.lib文件。

+0

所有這些簡單的答案麻煩!/MD&/ MT標誌正是需要的。/MT和/ MTd分別用於發佈和調試。謝謝你的幫助。 =) – 2012-03-14 13:05:05