错误 C2733:不允许重载函数“function”的第二个 C 语言链接。

16

我试图在Visual Studio 2010 Pro中编译旧的cpp MFC项目。

它使用了使用Labview编译的dll,我加入这些信息是因为我不知道是什么引起了错误消息...

多个函数上出现相同类型的错误消息。

error C2733: second C linkage of overloaded function 'function name' not allowed.

这个'函数名'包括:'StrCatW'、'StrCmpNW'、'StrCmpW'、'StrCpyNW'和'StrCpyW'

我在网上找到了一个类似的案例

尽管链接中的建议没有解决我的问题,我仍然看到相同的错误信息。

先感谢任何试图帮助的人。


1
看起来函数StrCatWStrCmpNW等被链接了多次或者它们在多个文件中被包含,但是没有声明为inline - Thomas Matthews
1
@ThomasMatthews 错误并不是说有多个相同函数的定义,而是有多个重载使用了相同的名称。在这种情况下的问题是,由于 C 语言链接,名称混淆被禁用,因此您不能拥有具有完全相同名称的符号引用不同的函数。 - David Rodríguez - dribeas
1个回答

19

我对MFC没有经验,但我会尝试回答。 当使用extern "C"声明一个函数时,如果参数的集合不同就会出现这样的错误消息。例如:

extern "C" int myfunc(int);
extern "C" int myfunc(char);

在你的情况下,这两种声明可能与 char* 相关:

extern "C" char* StrCatW(char*, char*);
extern "C" wchar_t* StrCatW(wchar_t*, wchar_t*);
尝试在你的解决方案中关闭Unicode支持:我猜,如果这个dll真的很旧,它会以char*参数声明StrCatW,这与某些其他声明冲突。 如果这没有帮助,那么打开预处理输出(/E编译器开关,据我回忆)-它将输出一个非常大的文件,因此在其中查找StrCatW,也许它会给你一些线索,告诉你发生了什么。

谢谢您的建议。关闭了Unicode支持,但仍然无法正常工作,所以我将尝试使用预处理输出,并查看发生了什么。 - swcraft
你好,当我在VS 2010中启用预处理器(/P)时,出现了LINK错误,要求stdafx.obj,这是我的源文件列表中第一个cpp的obj文件。我找到了MSDN的错误解释,似乎与你建议的相关... http://msdn.microsoft.com/en-us/library/5z9es6ec(v=vs.71).aspx - swcraft
我通过在头文件中注释掉错误列表中的函数“second C linkage”来简单解决了这个问题。 - swcraft
1
在我的情况下,错误是因为我在头文件中将一个函数声明为extern "C" {DECLDIR void GetSetFrameFunctionPointers( void (*myfunc)(int i) );},但在cpp文件中实现时将其写成了extern "C" {DECLDIR void GetSetFrameFunctionPointers( void (*myfunc)() );}。缺少了int i,这导致了错误。 - Nav
1
是的,我想这也属于David Rodríguez - dribeas在第一个线程中评论的类别。在你的情况下,我假设C/C++将无参数函数视为有效,但是由于在C链接中禁用了名称重整,仍然会创建错误。 - swcraft
在我的情况下,我dll中声明的'extern "C" __declspec(dllexport)'函数与一个同名的Windows函数发生了冲突。更改为一个不太常见的名称解决了这个问题。 - andreaciri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接