2009-06-14 29 views
1

私のVC++ソリューションには、アプリケーション(exe)と静的ライブラリという2つのプロジェクトが含まれています。Visual C++ 2008で静的ライブラリをリンクする方法は?

どちらもコンパイルできますが、リンクできません。私は私が使用する静的ライブラリから各関数の "未解決の外部シンボル"エラーが発生しています。彼らは、次のようになります。

MyApplication.obj:エラーLNK2019:未解決の外部シンボル "(のsockaddr int型、構造体*、INT *)__declspec(dllimportの)int型__cdecl MyStaticLibrary ::受け入れる"

アプリを見つけるのを.libは問題ありません。私は "dllimport"が問題だと思っています。なぜ静的ライブラリを構築しようとしているのですか?アプリケーションとライブラリは、 "マルチスレッドDLL(/ MD)"ではなく、 "マルチスレッド(/ MT)"ランタイムライブラリを使用します。

EDIT:

私は答えのいくつかは右だと思います。 UDTと呼ばれるライブラリが、これはメインのヘッダファイルにしています

#ifdef UDT_EXPORTS 
    #define UDT_API __declspec(dllexport) 
#else 
    #define UDT_API __declspec(dllimport) 
#endif 

これは、それが静的ライブラリとして使用されることを意図していなかったということですか?

+3

__declspec(dllimport)の由来はミステリーです - おそらくライブラリの.hファイルですが、どうやってそこに来ましたか?いくつかのマクロはワイルドになった?元気? –

答えて

3

どのようにリンクを設定していますか?そして、MyApplicationとMyStaticLibrary :: acceptのヘッダファイルはどのように見えますか?

両方のプロジェクトが同じソリューションファイルに含まれている場合は、ソリューションファイル - >プロパティを右クリックし、アプリケーションの依存関係としてライブラリを設定するのが最適な方法です。 Visual Studioは自動的にリンクを処理し、アプリケーションのビルド時にライブラリのビルドが最新であることを確認します。

あなたのヘッダファイルにDLLのインポート/エクスポートとして定義されているようなエラーです。

編集: はい、それは問題です。おそらく最初に動的ライブラリとして作成したでしょうか? (誰でも書いた人)

いくつかのオプションがあります。

1)コード内のすべてのものとすべてのUDT_API修飾子を削除することができます。

#define UDT_API 

3)より堅牢なソリューションはこれにそれを変更することです:あなたはその原料を削除し、この行を追加することができます

2)

#ifdef UDT_STATIC 
    #define UDT_API 
#else 
    #ifdef UDT_EXPORTS 
     #define UDT_API __declspec(dllexport) 
    #else 
     #define UDT_API __declspec(dllimport) 
    #endif 
#endif 

をそしてプリプロセッサディレクティブを追加しUDT_STATIC静的ライブラリとして使用する場合はプロジェクトに、動的ライブラリとして使用する場合は削除します。 (両方のプロジェクトに追加する必要があります)

+0

上記の私の編集を確認してください。これが理由です。 –

+0

まあ、上記のロバストなソリューションを使用しても同じエラーが生成されますが、__declspec(dllexport)は__declspec(dllimport)です。私はちょうど弾丸をかみ合わせ、DLLを使用する私の解決策を見直す必要があります。 –

+0

両方のプロジェクトのプリプロセッサディレクティブにUDT_STATICを追加して、両方を再構築しましたか? – Gerald

0

ソケットで作業しているので、プロジェクトのその他の依存関係にWS2_32.libを必ず追加してください。

+0

ええ、私はそれが含まれている、確認していただきありがとうございます。 –

+0

通常、ライブラリを追加しないことでこのようなエラーが発生します。それは奇妙だ。追加の依存関係があるのですか?それも一般的なlibsセクションに入れてみてください。 –

+0

彼のクラスメソッドacceptについては不平を言いますが、winsock accept関数ではありません。 – Gerald

0

静的ライブラリのエクスポートされた関数の呼び出し規則が間違っているようです。エクスポートされた関数のヘッダーファイルはどのように見えますか?

これで、関数は接頭辞としてUDT_APIを使用しています。リンクする静的な.libを作成しているだけではいけません。

代わりに、libを変更してdllを作成することもできます。だから、dllで静的なリンケージを作成します。問題はあなたのアプリケーションにDLLを提供しなければならないということだけです。それでも、あなたがlibで修正を行うことができるので、悪い解決策ではありません。

+0

あなたが正しいかもしれません、詳細については、私の編集を確認してください。 –

関連する問題