2012-03-13 61 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