c++ - g++ 抛出 "undefined reference to"静态类成员

标签 c++ g++

我正在编写 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-Horizo​​ntal.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++ 命令中。没有帮助。即使我将作业移至页眉也会出现错误。

最佳答案

您声明的static 类成员实际上被命名为Fakskod::codesTerminateWhite 等等。当你在源文件中定义它们时,你不再在类范围内,因此你需要键入全名:

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

否则,C++ 认为它们是两个不同的数组。

关于c++ - g++ 抛出 "undefined reference to"静态类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17052634/

相关文章:

c++ - 在 make 文件中链接 g++ 和 lib 不起作用

另一个命名空间中函数的 C++ ADL

c++ - 如何确定路径是否指定了实际文件?

c++ - 无法在 C++ 中将 64 位数字分配给 64 位最小值

c++ - 如何在构建字符串后使用命名占位符在多行原始字符串上使用 sprintf?

c++ - 如何重载 static 和 dynamic_pointer_cast

c - 获取嵌入式 PACKED_STRUCT 定义以在 g++ 下编译

c++ - 如何正确定义C++类析构函数并将其链接到主文件?

c++ - 如何翻转内存块中的任何位?

g++ - Valgrind 显示 ???对于行号,尽管 -g 标志