2017-01-12 6 views
-1

私はこれまでに似たような質問が投稿されていることを知っていますが、私が見てきたすべてのものは変数がクラスに存在すると仮定しています。私はクラスの一部を除去し、同じようなことを試してみましたが、それでも同じエラーを取得していますstatic変数への未定義参照、クラスなし

TestController.cpp:(.text+0xd0): undefined reference to `vio::HORIZONTAL_MOTOR' 

vio.h

#ifndef VIO_H 
#define VIO_H 
namespace vio 
{ 
     ... 
     extern TransistorTuple HORIZONTAL_MOTOR; 
     extern TransistorTuple FRONT_MOTOR; 
     extern TransistorTuple BACK_MOTOR; 
     ... 

vio.cpp

... 
void vio::initialize() 
{ 
     // Define variables 
     vio::TransistorTuple HORIZONTAL_MOTOR; 
     vio::TransistorTuple FRONT_MOTOR; 
     vio::TransistorTuple BACK_MOTOR; 
     ... 
} 

TestController.cpp

... 
void test::moveChair() 
{ 
     // Define variables 
     vio::TransistorTuple HORIZONTAL_MOTOR; 
     vio::TransistorTuple FRONT_MOTOR; 
     vio::TransistorTuple BACK_MOTOR; 
     ... 
} 

vio.cppで正常に動作しますが、TestController.cppで同じことをするとエラーになります。私はTestControllerにvio.hを含めています。

+0

これは明らかにいくつかの埋め込みコードであるため、コンパイラを使用すると便利です(多くの埋め込みコンパイラはsuck;))。しかし、... vio.cppでは、同じ '' namespace vio {...} ''ステートメントが必要です。そして、各変数に接頭辞は必要ありません。おそらく、あなたのコンパイラは理解しているでしょう... – BitTickler

+0

私はLinux上でcmakeを使ってコンパイルしています。 vio.cppはうまくリンクしています。もう1つは何が起こっているのかわかりません。 – DSchana

+0

トピックを外すビット:通常、グローバル変数を使用するのは悪い考えです。たぶんあなたは全体を再考したいと思うかもしれません。 – BitTickler

答えて

1

メンバ変数が静的である場合、あなたはそれのために静的(ない任意の関数で)宣言を提供する必要があります。vio.h

vio::TransistorTuple HORIZONTAL_MOTOR = (some value); 
1

名前空間vioextern変数を宣言します。

したがって、という変数を定義する場合は、vio::initialize()の機能の中でその変数をvio.cppに設定することはできません。

通常、vio.cppは、次のようになります。

#include <vio.h> 
namespace vio { 
    TransistorTuple HORIZONTAL_MOTOR = { /* however that type is initialized */ }; 
    void initialize() { 
     // whatever this function does when called... 
    } 
} 

上記のコードはHORIZONTAL_MOTORのでinitvarと呼ばれるになるだろう。 crt0.cppなどとよく呼ばれるmain()の前の起動コードは、コンパイラツールチェーンで通常提供されています(initvarsのコンストラクタを呼び出す)。

ツールチェーンによっては、プロジェクトの設定を修正する必要があります。場合によっては、初期化を行うことを「忘れる」古いC関連の起動コードを使用することがあります。しかし、それがあなたのケースでそうであれば、カスタムinitialize()機能でその間違いを回避することはできません。あなたのプロジェクトを修正する/ツールチェーンを構築する必要があります。

関連する問題