2

我搜索了错误 LNK2005“已在 .obj 中定义”,但找不到与我面临的特定问题相关的内容。希望有人可以帮助我...

我有一个标题foo.h

// foo.h

#ifndef FOO_H
#define FOO_H

void foo() {
    print("foo\n");
}

#endif

和主文件... main.cpp

// main.cpp

#include <thread>
#include "foo.h"

int main() {

    std::thread t(foo);
    t.join();

    return 0;
}

现在,它编译没有任何错误,并将给出的输出提供给控制台......

foo

但是如果我创建另一个文件foo.cpp并且只包含头文件foo.h而什么都不做......

// foo.cpp

#include "foo.h"

...我得到链接器错误 LNK2005 "void __cdecl foo(void)" (?foo@@YAXXZ) 已经在 main.obj 中定义

不知道这里出了什么问题。?!!

4

1 回答 1

1

您必须仅将 foo() 函数的原型放在头文件中,并将实现一次放在 .cpp 中。

因此, foo.h 必须包含:

#pragma once
void foo();

和 foo.cpp:

#include "foo.h"

void foo() {
    printf("Whatever");
}
于 2016-05-02T11:04:28.250 回答