2012-03-13 19 views
2

もう一度私です。私はすべての新しいプロジェクトと全く新しい問題で戻ってきました。 私はGrowlのために何かを実装しようとしています。静的ライブラリーまたは共用ライブラリー(どちらも提供されています)を使用してください。私は必要なヘッダーを含め、図書館にリンクしました。 (2つの方法は実際にはプロジェクトのプロパティとプラグマステートメントを通したものです)。しかし、依然として以下のリンカーエラーを受信し、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

これが影響してはならないという仮定の下でイム、私は私のプロジェクトPropeties文字がマルチバイト文字セットを使用するように設定されています: https://github.com/psinnott/gntp-send/wiki/Windows

いくつかの余分な情報を:私は次のページから事前に構築されたバイナリを取得し

何でもこれはWin32コンソールアプリケーションでもあります。

どこが間違っていますか?

更新:
グーグル経由でこれを見つけた: http://groups.google.com/group/growl-for-windows/browse_thread/thread/6c48a62454d062f1

は指示に従った:
は(。libgrowlstatiC++と一緒LIB)libgrowlstatic.libを追加しました
は、GROWL_STATICをプリプロセッサの定義を追加しましたおよび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 

だから私は、プロパティをプロジェクトに次の行、リンカ、コマンドラインを追加しました:今、次のいくつかを含めたくさんより多くのエラーを取得イム

/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以上あり、返信はありませんか? 私は怠け者ではないと私は誓う。私は図書館についての答えの1つを調べたが、多くの運がなかった。なぜこれがそのように動作しているのか説明していません。助けてください!

+0

ようこそ、私たちは皆本当にお会いしました:-) – 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とコードのコンパイル方法には明確な不一致があります。図書館の名前は、これがという静的なのリンクライブラリであることを強く示唆しています。名前の「静的」はそのことを明確にしています。ただし、静的リンクライブラリの代わりにDLLにコードが存在することを前提としたヘッダーを#includeするコードをコンパイルするときに使用されるディレクティブ__declspec(dllimport)についてのエラーメッセージについて説明します。

他のエラーも同様です。プロジェクト+プロパティ、C/C++、コード生成、ランタイムライブラリ設定は重要です。/MD設定を使用しています。この設定は、DLLを操作するときに適切です。ライブラリは、/ MTを使用してコンパイルされたことは間違いありません。これは、DLLを使用しないモノリシックなEXEを作成する場合に適切な設定です。競合する設定でビルドされたコードの2つのチャンクをリンクしようとしていますが、これに対処しようとするとリンカーが転倒します。これは、エラーメッセージで明示的に述べています。

.libのDLLバージョンを掘り起こすか、残りのコードで/ MTを一貫して使用する必要があります。通常、.hibファイルにリンクしようとしている.libのバージョンを伝える#defineがあります。

+0

そのような単純な答えのすべての問題!/MD&/ MTフラグは正確に必要なものです。/MTと/ MTdをそれぞれリリースとデバッグのために使用します。ご協力いただきありがとうございます。 =) –

関連する問題