v90プラットフォームツールセットを使用するように設定されたVisualStudio10を使用しています。同じクラスのいくつかを使用する3つのアプリケーションがあります。したがって、これらの各クラスのコピーを3つ持つのではなく、それらを共通の静的ライブラリに移動しようとしています。それらの1つは私にリンクの問題を与えています。他のものはうまくリンクしているようです。問題のクラスは次のとおりです。
ヘッダ
#ifndef LIMIT_SINGLE_INSTANCE_INCLUDED
#define LIMIT_SINGLE_INSTANCE_INCLUDED
#include <windows.h>
class CLimitSingleInstance
{
protected:
DWORD m_dwLastError;
HANDLE m_hMutex;
public:
CLimitSingleInstance(TCHAR *strMutexName);
~CLimitSingleInstance();
BOOL IsAnotherInstanceRunning();
};
#endif
体
#include "LimitSingleInstance.h"
CLimitSingleInstance::CLimitSingleInstance(TCHAR *strMutexName)
{
//Make sure that you use a name that is unique for this application otherwise
//two apps may think they are the same if they are using same name for
//3rd parm to CreateMutex
m_hMutex = CreateMutex(NULL, FALSE, strMutexName); //do early
m_dwLastError = GetLastError(); //save for use later
}
CLimitSingleInstance::~CLimitSingleInstance()
{
if (m_hMutex) //Do not forget to close handles.
{
CloseHandle(m_hMutex); //Do as late as possible.
m_hMutex = NULL; //Good habit to be in.
}
}
BOOL CLimitSingleInstance::IsAnotherInstanceRunning()
{
return (ERROR_ALREADY_EXISTS == m_dwLastError);
}
このクラスが私の主要なアプリケーションソリューションの1つに直接含まれている場合、問題はありません。これで静的libソリューションに移動しましたが、そのソリューションは正常にビルドされます。ただし、メインのアプリケーションソリューションを新しい静的ライブラリにリンクできなくなっていることがわかりました。メインアプリケーションのデバッグバージョンとリリースバージョンの両方をビルドしようとした結果は次のとおりです。
------再構築すべて開始:プロジェクト:WCCJ、構成:ReleaseTENA Win32 ------ CAssetEntity.cpp main.cpp ReadWCCJParameters.cppWCCJ.cppWCCJParameters.cppコード
の生成..
DCTUtilsRel.lib(MessageWrapper.obj):MSIL.netmoduleまたは/GLでコンパイルされたモジュールが見つかりました。/LTCGでリンクを再開します。リンクコマンドラインに/LTCGを追加して、リンカーのパフォーマンスを向上させます。ライブラリの作成.... \ bin\WCCJ-TENA.libおよびオブジェクト....\bin \ WCCJ-TENA.exp main.obj:エラーLNK2001:未解決の外部シンボル"public:__thiscall CLimitSingleInstance :: CLimitSingleInstance(char *)"(?? 0CLimitSingleInstance @@ QAE @ PAD @ Z).... \ bin \ WCCJ-TENA.exe:致命的なエラーLNK1120:1未解決の外部----- -再構築すべて開始:プロジェクト:WCCJ、構成:DebugTENA Win32 ------ CAssetEntity.cpp main.cpp ReadWCCJParameters.cpp
WCCJ.cppWCCJParameters.cppコードを生成しています...CAssetEntity.obj:警告LNK4075:「/ INCREMENTAL:NO」仕様のために「/EDITANDCONTINUE」を無視しますライブラリを作成しています.... \ bin\WCCJ-TENA-d.libおよびオブジェクト.... \ bin \ WCCJ-TENA-d.exp main.obj:エラーLNK2019:未解決の外部シンボル "public:__thiscall CLimitSingleInstance :: CLimitSingleInstance(char *)"(?? 0CLimitSingleInstance @@ QAE @ PAD @ Z)参照関数" void_ cdecl`動的初期化子'gSingleInstanceObj''(void) "(?? _EgSingleInstanceObj @@ YAXXZ).... \ bin \ WCCJ-TENA-d.exe:致命的なエラーLNK1120:1未解決の外部== ========すべて再構築:0成功、2失敗、0スキップ==========
バイナリエディタで.libを開き、リンカーが必要とするマングル名(?? 0CLimitSingleInstance @@ QAE @ PAD @ Z)を検索すると、実際には見つからないことがわかります。私が見つけることができる最も近い一致は次のとおりです。
?? 0CLimitSingleInstance @@ QAE @ PA_W @ Z
?? 1CLimitSingleInstance @@ QAE @ XZ
@ CLimitSingleInstance @@ QAEHXZ
なぜこれが起こっているのか、そしてそれを修正する方法を誰かに教えてもらえますか?前もって感謝します。
デイブ