1

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

ヘルマン.h

#ifndef HELLMAN_H
#define HELLMAN_H

#include "common.h"

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

#endif

ヘルマン.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])'

コードが正しくないのはなぜですか?

4

1 に答える 1

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)
{
    ...
于 2012-11-18T14:55:12.200 に答える