我正在编写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 ++命令。没有帮助。即使我将分配移动到标题,错误也会增加。
答案 0 :(得分:2)
您声明的static
类成员实际上名为Fakskod::codesTerminateWhite
,依此类推。在源文件中定义它们时,您不再在类范围内,因此您需要键入全名:
const unsigned char Fakskod::codesTerminateBlack[64][3] = {
// ...
};
没有它,C ++认为它们是两个不同的数组。