【问题标题】:extern C unresolved symbol with gcc 4.8?gcc 4.8的extern C未解析符号?
【发布时间】:2014-04-24 10:50:33
【问题描述】:

我有以下代码,它适用于 gcc 4.3 编译器,但是当我使用 gcc 4.8 编译时,得到解决的符号错误(链接时间)

//test.cc
ULONG CPULimit = 200; 

// 测试.h

namespace ABC
{
    class STAT
    {
    public:
        static ULONG getCPULimit();
    }
}

在同一个 test.h 文件本身中,我已经内联定义了 getCPULimit() 函数

inline ULONG
ABC::STAT::getCPULimit()
{
    extern ULONG CPULimit; 
    return CPULimit;
}

以上代码在 4.3 编译器下工作,4.8 出现未解决的符号错误。

将 extern ULONG CPULimit 移到函数之外,会起作用,但它会暴露全局变量。 现在我像这样用 extern "C" 包装了函数

extern "C"
{
    inline ULONG
    ABC::STAT::getCPULimit()
    {
       extern ULONG CPULimit; 
       return CPULimit;
    }
}

令人惊讶的是,它奏效了, 1)我不确定它是如何工作的,有人能解释一下吗?这是正确的做法吗?

2) 有两个 extern 是什么意思(一个 extern C 和一个 extern)

【问题讨论】:

  • 这不是您的实际代码,ULONG 不是类型
  • ULONG 是 Windows 标头中的 typedef unsigned long。我怀疑,您已将 MinGWgcc 4.3 更新为 gcc 4.8 并收到此错误?
  • 你为什么要extern "C"'ing一个类的静态成员?这与 extern "C" 的含义不完全相反(即确保 C++ 编译器理解它需要将 C ABI 应用于对外部 C 对象的函数调用)。

标签: c++ gcc extern gcc4.8


【解决方案1】:

最自然的方法 - 使您的全局变量 staticgetCPULimit 函数非内联并在 .cc 文件中实现。

我几乎可以肯定 extern "C" 块中的 C-ABI 不兼容函数要么未定义,要么被禁止。但是,您的函数是 static,因此它可能与 C ABI 兼容(尽管它看起来是个坏主意)。也许有人可以引用 C++ 标准中的相关内容。

【讨论】:

    【解决方案2】:

    ULONG 不是一种类型,但如果您不想使用普通类型,可以typedef 一种。 编辑: ULONG 应该是 ulong。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-03
      • 1970-01-01
      • 2021-01-13
      • 2010-12-15
      • 2012-06-17
      • 2013-02-28
      • 2012-11-19
      相关资源
      最近更新 更多