带有外部“C”的 C++ 导致重复符号错误

Posted

技术标签:

【中文标题】带有外部“C”的 C++ 导致重复符号错误【英文标题】:C++ with Extern "C" causing Duplicate Symbols Error 【发布时间】:2012-09-23 04:39:59 【问题描述】:

我正在尝试在我的头文件中为 c++ 类使用外部“C”函数。

当我编译时,我不断收到错误

duplicate symbol _currentInstance in:
main.o
GLHandler.o

我以为我有合适的守卫,但似乎无法弄清楚为什么会发生这种情况。任何帮助将不胜感激。

这是头文件。

#ifndef GLHANDLER_H
#define GLHANDLER_H

#include "LoadedObject.h"


#ifdef __cplusplus
extern "C" 
void displayCallback();

#endif



class GLHandler 

private:
    LoadedObject *object;

public:
    GLHandler(LoadedObject *);
    void initializeVBO(LoadedObject *);
    void renderObject(struct model *);
    void displayFunction(void);
    model *createModel(void);
    void setupDisplayCallback();


;

GLHandler *currentInstance;

#ifdef __cplusplus


#endif

#endif

编辑:David 很快指出,extern GLHandler *currentInstance 修复了错误。

【问题讨论】:

也许应该是extern GLHandler *currentInstance; 你肯定在 main.c 和 GLHandler.c 中实现了这个函数。或者你把它放到一个头文件中而不是内联它。 【参考方案1】:

这个问题与extern "C" 声明无关——你在头文件中定义了一个全局变量,所以它在每个编译单元中都被定义:

GLHandler *currentInstance;

在标题中,您应该改用:

extern GLHandler *currentInstance;

那么在正好一个.cpp文件中有:

GLHandler *currentInstance;

作为旁注,就目前而言,标头仅对 C++ 有效,因为它具有类定义。 #ifdef __cplusplus 指令是毫无意义的混乱(尽管无害)。

【讨论】:

以上是关于带有外部“C”的 C++ 导致重复符号错误的主要内容,如果未能解决你的问题,请参考以下文章

C ++ glfw未解决的外部符号错误[重复]

“编译为”设置为“默认”时的外部符号链接错误[重复]

C++ - 未解析的外部符号

带有谷歌时间戳的 Protobuf C++ 消息导致段错误 [重复]

LNK2019“未解析的外部符号”错误(C++ OpenGL)

C ++链接错误未解决的外部符号