Levi Roberts
Levi Roberts

Reputation: 1317

Library linker errors driving me mad

It's me again. I'm back with an all new project and an all new problem. I am trying to implement something for Growl. Either using a static or shared library (both are provided). I included the necessary header and linked to the library. (2 ways actually, once through the project properties and the other through a pragma statement). However, im still receiving the following linker errors:

error LNK2001: unresolved external symbol "__declspec(dllimport) public: __thiscall Growl::Growl(enum Growl_Protocol,char const * const,char const * const,char const * * const,int)" (__imp_??0Growl@@QAE@W4Growl_Protocol@@QBD1QAPBDH@Z)
error LNK2001: unresolved external symbol "__declspec(dllimport) public: __thiscall Growl::~Growl(void)" (__imp_??1Growl@@QAE@XZ)
fatal error LNK1120: 2 unresolved externals

The line of code that is causing these linker errors is this line:

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

The header file is being included at the top of the file and I am linking with the following line:

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

The header source can be found here: https://github.com/psinnott/gntp-send/blob/master/headers/growl%2B%2B.hpp

I retrieved the pre-built binaries from the following page: https://github.com/psinnott/gntp-send/wiki/Windows

Some extra info: I do have my Project Propeties character set to use Multi-Byte Character Set, im under the assumption this shouldn't affect anything. This is also a Win32 Console application.

Where am I going wrong?

Update:
Found this via google: http://groups.google.com/group/growl-for-windows/browse_thread/thread/6c48a62454d062f1

Followed the instructions:
Added the libgrowlstatic.lib (alongside libgrowlstatic++.lib)
Added the pre-processor definitions, GROWL_STATIC and GROWL_CPP_STATIC

Got lots of error including:

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

So I added the following line to Project properties, Linker, Command Line:

/NODEFAULTLIB:MSVCRTD /NODEFAULTLIB:LIBCMT 

Now im getting alot more errors including some of the following:

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

Been at this for several hours and can't seem to figure it out. 10+ views and no replies? I swear im not being lazy. I looked into one of the answers provided about libraries but didn't have much luck. Nothing explained why this is acting the way it is. Please help!

Upvotes: 2

Views: 5660

Answers (2)

user141249
user141249

Reputation:

This is working for me. It assumes you want to use the static libraries and not the dll.

Properties -> Configuration -> Properties -> VC++ Directories

Add directory of unzipped sdk to include and library directories

Properties -> Configuration -> Properties -> C/C++ -> Preprocessor

Add GROWL_STATIC and GROWL_CPP_STATIC to preprocessor definitions

Properties -> Configuration -> Properties -> C/C++ -> Code generation

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

Properties -> Configuration -> Properties -> Linker -> Input

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

Upvotes: 1

Hans Passant
Hans Passant

Reputation: 942109

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

There is a clear mismatch between the #pragma and the way your code is getting compiled. The name of the library strongly suggests this is a static link library, the "static" in the name makes that clear. The error messages however talk about __declspec(dllimport), a directive that's used when you compile code that #includes a header that assumes the code lives in a DLL instead of a static link library.

The other errors you are getting bear this out as well. The Project + Properties, C/C++, Code Generation, Runtime Library setting matters. You are using the /MD setting, a setting that's appropriate when you work with DLLs. The library no doubt was compiled with /MT, a setting appropriate when you create a monolithic EXE that doesn't use DLLs. You are trying to link two chunks of code that were built with conflicting settings, the linker falls over when trying to deal with this. It explicitly says so in an error message.

You'll need to either dig up the DLL version of the .lib or use /MT consistently in the rest of your code. There's usually a #define that tells the .h file which version of the .lib you intend to link.

Upvotes: 2

Related Questions