.h
クラスと関連する変数をすべて名前空間で定義するファイルを含む DLL プロジェクトがあります。これは VS 2008 を使用する Windows XP です。明らかですが、これは gstreamer プログラムです :-)
receiverList
名前空間の変数が必要ですIPC_RECEIVER
が、その名前空間の外、たとえば対応する名前空間でそれを見たいと思っていIPC_SENDER
ます。
// IPC-Receiver..h
#ifndef IPCRECEIVER_H_
#define IPCRECEIVER_H_
namespace IPC_RECEIVER
{
.... class declaration.
}
typedef std::list<IPC_RECEIVER::GstReceiver*> ReceiverList_t;
typedef std::list<IPC_RECEIVER::GstReceiver*>::iterator ReceiverListIter_t;
#endif /* IPCRECEIVER_H_ */
次に、変数 g_receiverList が IPC_RECEIVE 名前空間で宣言されているが、どのクラスでも宣言されていない cpp ファイル。
// IPC-ReceeiverAPIs.cpp
#include "IPC-Receiver.h"
namespace IPC_RECEIVER
{
ReceiverList_t g_receiverList; // list to track receivers
...
}
そして最後に 3 番目のファイル
// IPC-Receiver.cpp
#include "IPC-Receiver.h"
extern ReceiverList_t g_receiverList;
namespace IPC_RECEIVER
{
GstReceiver::GstReceiver()
{
g_receiverList.push_back( this );
}
}
これをコンパイルすると、次のエラーが発生します。
Error 1 error LNK2001: unresolved external symbol
"class std::list<class IPC_RECEIVER::GstReceiver *,
class std::allocator<class IPC_RECEIVER::GstReceiver *> > g_receiverList"
(?g_receiverList@@3V?$list@PAVGstReceiver@IPC_RECEIVER@
@V?$allocator@PAVGstReceiver@IPC_RECEIVER@@@std@@@std@@A)
IPC-Receiver.obj
extern とコンストラクターに名前空間名を追加するさまざまな組み合わせを試しました。
と
IPC_RECEIVER::g_receiverList.push_back( this );
私は得る:
Error 1 error C2039: 'g_receiverList' : is not a member of
'IPC_RECEIVER' x:\Projects\IPC-dll\IPC-dll\IPC-Receiver.cpp 54 IPC-dll
そして
extern ReceiverList_t IPC_RECEIVER::g_receiverList;
2 つのエラーが表示されます。
Error 2 error C2039: 'g_receiverList' : is not a member of 'IPC_RECEIVER' x:\Projects\IPC-dll\IPC-dll\IPC-Receiver.cpp 22
Error 2 error C2039: 'g_receiverList' : is not a member of 'IPC_RECEIVER' x:\Projects\IPC-dll\IPC-dll\IPC-Receiver.cpp 55
ここで、22 と 54 はg_receiverList
が使用されている行です。
::
の代わりに使用してIPC_RECEIVER::
も機能しません。
では、これを機能させるにはどうすればよいでしょうか: あるファイルの名前空間で変数を宣言し、それを別のファイルで使用しますか?
これはリンク順の問題ですか?