多线程函数已在.obj中定义

时间:2016-05-02 11:01:01

标签: multithreading c++11 visual-c++ lnk2005

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

我有一个标题 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中定义

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

1 个答案:

答案 0 :(得分:1)

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

因此,foo.h必须包含:

#pragma once
void foo();

和foo.cpp:

#include "foo.h"

void foo() {
    printf("Whatever");
}