0

我有一个带有外部“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()
    { 
    }
}

我尝试以不同的顺序重新排列我的包含标头,甚至除了 file_two.cpp 的包含之外,甚至在 file_one.cpp 中没有放置包含标头,但我总是遇到相同的错误。

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

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

我到底做错了什么?我应该怎么做才能修复它?

谢谢!

4

1 回答 1

1

您可能会遇到问题,因为您将文件包含在File_two.cpp文件中File_one.cpp。正在发生的事情是,File_two.cpp并且File_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"。

于 2012-03-25T04:20:24.037 回答