0

CCITT Group 4 エンコーダーを作成していますが、リンカーに問題があるようです。

static constクラスメンバーとして保存された生のバイナリデータがあります( Fakskod.h):

class Fakskod {
  public:
  // ...
   static const unsigned char codesTerminateWhite[64][3];
   static const unsigned char codesTerminateBlack[64][3];
   static const unsigned char codesMakeUpWhite[40][3];
   static const unsigned char codesMakeUpBlack[40][3];

  private:
  //...
} ;

中括弧で囲まれた初期化子はクラス定義では使用できないため、別の場所で初期化する必要がありました。ヘッダーのクリアさは言うまでもありません。したがって、別のファイル ( Fakskod-codes.cpp) にデータを割り当てました。

const unsigned char codesTerminateBlack[64][3] = { {0x0d, 0xc0, 0xa}, 
{0x40, 0x0, 0x3},  {0xc0, 0, 0x2}, {0x60, 0, 0x3},  {0x30, 0, 0x4},
{0x20, 0, 0x4}, {0x18, 0, 0x5},  {0x14, 0, 0x6},  {0x10, 0, 0x6},
//... (~200 hex bytes)
} ;

そして、それは私が得たものです:

/tmp/ccm0ijoi.o: In function `Fakskod::makeCode(int, fkColor)':
rectangle_test.cpp:(.text+0x19b0): undefined reference to `Fakskod::codesTerminateWhite'
rectangle_test.cpp:(.text+0x1a02): undefined reference to `Fakskod::codesMakeUpWhite'
rectangle_test.cpp:(.text+0x1a7b): undefined reference to `Fakskod::codesTerminateWhite'
rectangle_test.cpp:(.text+0x1b0f): undefined reference to `Fakskod::codesTerminateBlack'
rectangle_test.cpp:(.text+0x1b5e): undefined reference to `Fakskod::codesMakeUpBlack'
rectangle_test.cpp:(.text+0x1bce): undefined reference to `Fakskod::codesTerminateBlack'
collect2: error: ld returned 1 exit status

問題の原因は次の方法 ( Fakskod-Horizontal.cpp) にあるようです。

std::vector<unsigned char> Fakskod::makeCode(int num, fkColor color) {

  #define FAKSKOD_MKCD(TERM, MKUP) \
  if(num < 64) \
    return vectorize( TERM [num]); \
  else { \
    for(int i=40; i>0; i--) \
       if(num/64 == i) { \
           code = vectorize( MKUP [i-1]); \
           num -= 64 * i; \
       } \
    return mergeStreams(code, vectorize( TERM [num])); \
  }

   std::vector<unsigned char> code;
   if(color==WHITE)    { FAKSKOD_MKCD(codesTerminateWhite, codesMakeUpWhite) }
   else                { FAKSKOD_MKCD(codesTerminateBlack, codesMakeUpBlack) }

} // Fakskod::makeCode

マクロですべてがうまくいっていると確信しています。プリプロセッサ ( g++ -E) はそれを正しく解決し、展開されたバージョンをコードに貼り付けると、メッセージは同じです。

また#include、ヘッダーファイルとFakskod-codes.cpp、またはこれらのファイルを g++ コマンドに追加しようとしました。役に立ちませんでした。割り当てをヘッダーに移動してもエラーが発生します。

4

1 に答える 1

2

宣言したstaticクラス メンバーには実際に名前が付けられFakskod::codesTerminateWhiteます。ソース ファイルでそれらを定義すると、もはやクラス スコープ内にないため、完全な名前を入力する必要があります。

const unsigned char Fakskod::codesTerminateBlack[64][3] = {
    // ...
};

それがなければ、C++ はそれらが 2 つの異なる配列であると認識します。

于 2013-06-11T20:00:49.650 に答える