0

.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::も機能しません。

では、これを機能させるにはどうすればよいでしょうか: あるファイルの名前空間で変数を宣言し、それを別のファイルで使用しますか?

これはリンク順の問題ですか?

4

1 に答える 1

1

extern を名前空間に配置する必要があります

namespace IPC_RECEIVER
{
   extern ReceiverList_t    g_receiverList;
}

そして、IPC_RECEIVER 名前空間内にないコードからの修飾名で使用します。

例えば

void main() {
   IPC_RECEIVER::g_receiverList.push_back(...);
}

あなたの例では、IPC_RECEIVER 名前空間にいるので、IPC_RECEIVER::ビットは必要ありません。

于 2013-02-20T19:25:39.120 に答える