两个带extern“C”的文件的C ++ lnk2005错误,为什么?

时间:2012-03-25 04:01:23

标签: c++ c++-cli export command-line-interface lnk2005

我有一个带有外部“C”功能的CPP。如果它们都在一个文件中,那么一切都很好。我想将功能拆分为不同的文件,仅用于组织目的。

让我们说我有这两个文件:

File_One.cpp

#pragma once
#include "stdafx.h"
#include <windows.h>
#include "Functions.h"
#include "Variables.h"
#include <string>
#include "File_Two.cpp"

extern "C"
{
    __declspec(dllexport) void MethodOne()
    { 
        MethodTwo();
    }
}

File_Two.cpp

#pragma once
#include "stdafx.h"
#include <windows.h>
#include "Functions.h"
#include "Variables.h"
#include <string>

extern "C"
{
    __declspec(dllexport) void MethodTwo()
    { 
    }
}

我尝试以不同的顺序重新排列我的include标头,甚至在file_one.cpp中没有包含标题而不包括file_two.cpp的包含但是我总是得到相同的错误。

1)错误LNK1169:找到一个或多个多重定义的符号

2)错误LNK2005:_MethodTwo已在File_One.obj中定义

我究竟做错了什么? 我该怎么做才能解决它?

谢谢!

1 个答案:

答案 0 :(得分:1)

您可能遇到问题,因为您在File_two.cpp文件中包含File_one.cpp文件。发生的事情是File_two.cppFile_one.cpp正在编译和链接。但由于File_two.cpp中包含File_one.cpp,链接器会看到MethodTwo的两个副本,无法决定使用哪个。

您应该将声明移到标题:

File_two.h:

extern "C"
{
    __declspec(dllexport) void MethodOne()
}

而是包括它。

File_one.h:

extern "C"
{
    __declspec(dllexport) void MethodOne();
}

然后在各自的.cpp文件中定义函数及其主体。源文件中不需要extern“C”。