2012-03-13 2 views
2

다시 나야. 나는 완전히 새로운 프로젝트와 모든 새로운 문제로 돌아 왔습니다. 나는 Growl을 위해 뭔가를 구현하려고합니다. 정적 또는 공유 라이브러리를 사용합니다 (둘 다 제공됨). 필요한 헤더를 포함하고 라이브러리에 연결했습니다. (실제로 프로젝트 속성을 통해 한 번, 두 번째 방법은 pragma 문을 통해). 그러나 메신저는 여전히 다음과 같은 링커 오류를 수신 : 헤더 파일은 파일의 상단에 포함되는나를 화나게하는 도서관 링커 오류

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

:

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 

이러한 링커 오류를 일으키는 코드의 라인이 라인

헤더 소스는 여기에서 찾을 수 있습니다

#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

일부 추가 정보 : 내 프로젝트 Propeties 문자는 가정하에 멀티 바이트 문자 집합, 메신저를 사용하도록 설정해야 할이 영향을 미치지 않습니다

나는 다음 페이지에서 사전 구축 된 바이너리를 검색 아무것도. 이것은 Win32 콘솔 응용 프로그램이기도합니다.

어디로 잘못 가고 있습니까?

업데이트 :
이 구글을 통해이 발견 : GROWL_STATIC (libgrowlstatiC++ lib 디렉토리와 함께.)
추가 libgrowlstatic.lib
추가 전처리 정의, : http://groups.google.com/group/growl-for-windows/browse_thread/thread/6c48a62454d062f1

이 지침을 따랐 및 GROWL_CPP_STATIC

다음을 포함한 많은 오류가 발생했습니다. 012

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 

3,그래서 나는 속성, 링커, 명령 줄을 프로젝트에 다음 줄을 추가 :

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 

갔었 :

/NODEFAULTLIB:MSVCRTD /NODEFAULTLIB:LIBCMT 

지금 메신저

는 다음의 몇 가지를 포함하여 많이 이상의 오류를 받고 몇 시간 동안 이걸로 알아낼 수 없습니다. 조회수 10 회 이상 없음 게으른 게 아니라고 맹세코. 도서관에 관한 답변 중 하나를 살펴 보았지만 행운이별로 없었습니다. 왜 이것이 이것이 어떻게 작동하는지 설명하지 못했습니다. 도와주세요!

+0

안녕하세요, Levi, 우리 모두는 정말로 당신을 그리워했습니다 :-) – paxdiablo

+0

hehe. 고마워요. =) –

+0

링커에서 내 보낸 함수를 찾고 있지만 가져 오기 라이브러리가 아닌 정적 라이브러리를 제공하는 것처럼 보입니다. –

답변

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의 대답을 사용하여 이것을 어제 알아 냈다. 귀하의 답변을 가장 명확한 답변으로 선택했습니다. 당신의 대답은 그것이 작동하도록 정확히 무엇을해야만하는지입니다! –

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

#pragma와 코드가 컴파일되는 방식 사이에 명확한 불일치가 있습니다. 라이브러리의 이름은 이것이 정적 인 링크 라이브러리임을 강력히 시사합니다. 이름에 "static"은 명확하게 나타냅니다. 그러나 오류 메시지는 정적 링크 라이브러리 대신 DLL에 코드가 있다고 가정하는 헤더를 # 포함하는 코드를 컴파일 할 때 사용되는 __declspec (dllimport) 지시어에 대해 설명합니다.

다른 오류도 발생합니다. 프로젝트 + 속성, C/C++, 코드 생성, 런타임 라이브러리 설정은 중요합니다. DLL로 작업 할 때 적절한 설정 인/MD 설정을 사용하고 있습니다. 라이브러리는 의심의 여지없이 DLL을 사용하지 않는 모 놀리 식 EXE를 만들 때 적절한 설정 인/MT로 컴파일되었습니다. 충돌하는 설정으로 구축 된 코드 두 개를 연결하려고하면 링커가이 문제를 해결하려고합니다. 그것은 오류 메시지에서 명시 적으로 말합니다.

.lib의 DLL 버전을 찾아 보거나 나머지 코드에서/MT를 일관되게 사용해야합니다. 일반적으로 .hib 파일에 연결하려는 .lib의 버전을 알려주는 #define이 있습니다.

+0

그런 간단한 대답에 문제가 있습니다./MD 및/MT 플래그는 정확히 필요한 것입니다./MT 및/MTd 각각 릴리스 및 디버그. 당신의 도움을 주셔서 감사합니다. =) –