多文件C ++项目中未定义的引用链接器错误

时间:2012-11-18 14:41:49

标签: c++ linker mingw

我正在使用C ++编写一个多文件项目,它给我链接器错误,我不明白为什么。是的,我一直在搜索,但其他人似乎都遇到了第三方库和-l链接标志的问题,这不是这里的情况。一个小摘录,应该包括所有相关的代码片段:

的main.cpp

#include "common.h"
//...
void sort_table(byte table[TABLE_LENGTH][2][CIPHER_SIZE], const unsigned int beg = 0, const unsigned int end = TABLE_LENGTH)
{
    //..
}
void precompute_table(byte table[TABLE_LENGTH][2][CIPHER_SIZE])
{
    //..
    #ifdef METHOD_HELLMAN
    precompute_hellman_table(table);
    #endif
    //..
}
int main()
{
    //..
    byte table [TABLE_LENGTH][2][CIPHER_SIZE];
    precompute_table(table);
    //..
}

COMMON.H

#ifndef COMMON_H
#define COMMON_H
//..
typedef unsigned char byte;
//..
#define METHOD_HELLMAN
#define TABLE_LENGTH 40000
#define CIPHER_SIZE 2
//..
void sort_table(byte[TABLE_LENGTH][2][CIPHER_SIZE]);
//..
#endif

hellman.h

#ifndef HELLMAN_H
#define HELLMAN_H

#include "common.h"

extern void precompute_hellman_table(byte[TABLE_LENGTH][2][CIPHER_SIZE]);

#endif

hellman.cpp

#include "hellman.h"
//..
void precompute_hellman_table(byte table[TABLE_LENGTH][2][CIPHER_SIZE])
{
    //..
    sort_table(table);
}

所以 hellman.cpp 使用 main.cpp 中的常规函数​​,该函数在 common.h 中正向声明。使用MinGW编译/链接时会产生以下错误:

File                                Message
obj\Release\hellman.o:hellman.cpp   undefined reference to `sort_table(unsigned char (*) [2][2])'

为什么我的代码不正确?

1 个答案:

答案 0 :(得分:1)

这是您的声明

// common.h
void sort_table(byte table[TABLE_LENGTH][2][CIPHER_SIZE]);

这是你的定义

// main.cpp
void sort_table(byte table[TABLE_LENGTH][2][CIPHER_SIZE], 
    const unsigned int beg = 0, const unsigned int end = TABLE_LENGTH)
{
    ...

看到区别?

声明和定义应该相同,但默认值应仅在声明中。

喜欢这个

// common.h
void sort_table(byte table[TABLE_LENGTH][2][CIPHER_SIZE], 
    const unsigned int beg = 0, const unsigned int end = TABLE_LENGTH);

和这个

// main.cpp
void sort_table(byte table[TABLE_LENGTH][2][CIPHER_SIZE], 
    const unsigned int beg, const unsigned int end)
{
    ...