1

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

なぜこれが起こっているのか、そしてそれを修正する方法を誰かに教えてもらえますか?前もって感謝します。

デイブ

4

2 に答える 2

2

CLimitSingleInstance :: CLimitSingleInstance(char_t *)がないようです。あなたの図書館で。両方のプロジェクトの定義を確認しましたか?

undname.exeVisualStudioの一部であるMicrosoftユーティリティがあります:

C:\Program Files\Microsoft Visual Studio\COMMON\Tools>UNDNAME.EXE
Microsoft(R) Windows NT(R) Operating System
UNDNAME Version 5.00.1768.1Copyright (C) Microsoft Corp. 1981-1998

usage: UNDNAME [-f] decorated-names...
       -f Undecorate fully.  Default is to only undecorate the class::member


したがって、リンカーは次のことを望んでいます。

>UNDNAME.EXE -f ??0CLimitSingleInstance@@QAE@PAD@Z
Microsoft(R) Windows NT(R) Operating System
UNDNAME Version 5.00.1768.1Copyright (C) Microsoft Corp. 1981-1998

>> ??0CLimitSingleInstance@@QAE@PAD@Z == public: __thiscall CLimitSingleInstance::CLimitSingleInstance(char *)

そしてあなたは図書館にいます:

>UNDNAME.EXE -f ??0CLimitSingleInstance@@QAE@PA_W@Z
Microsoft(R) Windows NT(R) Operating System
UNDNAME Version 5.00.1768.1Copyright (C) Microsoft Corp. 1981-1998

>> ??0CLimitSingleInstance@@QAE@PA_W@Z == public: __thiscall CLimitSingleInstance::CLimitSingleInstance(wchar_t *)


>UNDNAME.EXE -f ??1CLimitSingleInstance@@QAE@XZ
Microsoft(R) Windows NT(R) Operating System
UNDNAME Version 5.00.1768.1Copyright (C) Microsoft Corp. 1981-1998

>> ??1CLimitSingleInstance@@QAE@XZ == public: __thiscall CLimitSingleInstance::~CLimitSingleInstance(void)
于 2012-06-09T20:29:44.527 に答える
2

私が見つけることができる最も近い一致は次のとおりです:?? 0CLimitSingleInstance @@ QAE @ PA_W @ Z

そのシンボルのVSコマンドラインからundname.exeユーティリティを使用します。

C:\>undname ??0CLimitSingleInstance@@QAE@PA_W@Z
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.

Undecoration of :- "??0CLimitSingleInstance@@QAE@PA_W@Z"
is :- "public: __thiscall CLimitSingleInstance::CLimitSingleInstance(wchar_t *)"

引数の型は、char*ではなくwchar_t*であることに注意してください。libプロジェクトにはUNICODE#definedがありますが、exeプロジェクトにはありません。関連する設定は、一般+文字セットです。

于 2012-06-09T20:33:36.973 に答える