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

huwehgph  于 2023-03-14  发布在  其他
关注(0)|答案(1)|浏览(148)

我有一个带有外部“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_one.cpp中除了file_two.cpp的包含头之外不放置任何包含头,但我总是得到相同的错误。
1)错误LNK 1169:找到一个或多个多重定义的符号
2)错误LNK 2005:_MethodTwo已在File_One.obj中定义
我到底做错了什么?我该怎么做才能弥补?
谢谢大家!

qfe3c7zg

qfe3c7zg1#

您可能遇到了问题,因为您将File_two.cpp文件包含在File_one.cpp文件中。发生的情况是File_two.cppFile_one.cpp正在被编译和链接。但由于File_two.cpp包含在File_one.cpp中,链接器看到MethodTwo的两个副本,无法决定使用哪个。
您应该将声明移到标题中:
File_one.h:

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

把它也包括进去。
File_two.h:

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

然后在各自的.cpp文件中定义函数和函数体,不需要在源文件中使用extern“C”。

相关问题