CodeBlocks 编译器在使用我的头文件中声明的函数时给出“未定义引用”错误

问题描述 投票:0回答:1

尝试构建和运行我的 C++ 项目时遇到以下错误:

||=== Build: Debug in CS II (compiler: GNU GCC Compiler) ===|

obj\Debug\main.o||In function 'main':|
|30|undefined reference to '(anonymous namespace)::deleteRepeats(char*)'||

|error: ld returned 1 exit status|
||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

每个文件的代码如下(如果有很多错误或完全错误,我不会感到惊讶,因为我根本无法测试它,而我的重点是解决这个问题):

main.cpp:

#include <iostream>
#include "implementation.hpp"

int main()
{
    char originalArray[SIZE];
    originalArray[0] = 'a';
    originalArray[1] = 'b';
    originalArray[2] = 'b';
    originalArray[3] = 'c';
    originalArray[4] = 'a';
    originalArray[5] = 'c';
    originalArray[6] = 'a';
    originalArray[7] = 'c';
    originalArray[8] = 'b';
    originalArray[9] = 'c';
    char *noRepeats;
    noRepeats = deleteRepeats(&(originalArray[0]));
    std::cout << noRepeats;
    return 0;

}

实现.hpp:

#ifndef IMPLEMENTATION_HPP
#define IMPLEMENTATION_HPP
namespace
{
    const int SIZE = 10;
    char* deleteRepeats(char*);
}
#endif

实现.cpp:

#include "implementation.hpp"

char* deleteRepeats(char* array_to_edit)
{
    char new_array[SIZE];
    int num_of_unique_letters_seen = 0;
    for (int letter = 0; letter < SIZE; letter++)
    {
        bool already_exists = false;
        for (int letter_seen = 0; letter_seen < num_of_unique_letters_seen; letter_seen++)
        {
            if (array_to_edit[letter] == new_array[letter_seen])
            {
                already_exists = true;
            }
        }
        if (!already_exists)
        {
            new_array[num_of_unique_letters_seen] = array_to_edit[letter];
            num_of_unique_letters_seen++;
        }
    }
    return &new_array[0];
}

我在这个问题的答案的评论中被提示问这个问题,这非常相似,但是当问题出现时,接受的答案已经在我的项目中完成了。

c++ codeblocks header-files
1个回答
0
投票

在未命名命名空间中声明的函数具有内部链接。所以需要在每个编译单元中定义它。

否则在命名空间中声明它。

© www.soinside.com 2019 - 2024. All rights reserved.