"X"的声明具有不同的语言联系

declaration of 'x' has a different language linkage

本文关键字:联系 语言 声明      更新时间:2023-10-16

当我构建源代码时,它抛出了一个错误:declaration of 'globalMemTrace' has a different language linkage

#ifdef MEMDEBUG_SIMULATIONS
#include "mem-trace.h"
MemTrace *globalMemTrace;
#endif
// omitted unrelated parts    
int Tcl_AppInit(Tcl_Interp *interp)
{
#ifdef MEMDEBUG_SIMULATIONS
    extern MemTrace *globalMemTrace;
    globalMemTrace = new MemTrace;
#endif
}

我已经用谷歌搜索了好几次。有人说这是由于错误,如果clang,有些人说以不同的方式使用extern技巧可能会解决它。

但由于我不是这样的职业,我尝试了其中的一些,但都没能解决。有什么好办法处理吗?

它是用C++写的,问题发生在extern MemTrace *globalMemTrace;

>C++在语言链接的 from 中提供C++和非C++语言之间的链接。

例如

//  in C++ program
extern "C" int displayfoo(const char *);
int main() {
    return displayfoo("hello");
}
/*  in C program     */
#include <stdio.h>
extern int displayfoo(const char * str) {
    while (*str) {
       putchar(*str);
       putchar(' ');
       ++str;
    }
    putchar('n');
} 

您正在使用来自 c++ 代码displayfoo的 C 函数,因此您需要告诉编译器/链接器它来自不同的语言。这是由外部"C"完成的。

在你的代码中MemTrace *globalMemTrace;可能以前在 C 代码或 C++ 中的 C 块中声明,所以你需要像

extern "C" MemTrace *globalMemTrace;

这意味着实际变量是用 C 代码声明的,或者至少包装在C++代码的extern "C"块中,但extern是用C++代码声明的,因此它不能链接到变量,因为它们存在于不同的语言中。

看看这些文章:

语言联动

链接 C 和 C++ 代码

似乎这个名字已经被声明为具有C语言链接。

extern "C" MemTrace *globalMemTrace;