【问题标题】:VS2010 with extern keywordVS2010 带 extern 关键字
【发布时间】:2011-04-19 15:08:23
【问题描述】:

我有以下两个文件:

  1. foo.h
  2. bar.cpp

foo.h 中,我清除了一个变量extern

现在,我想在bar.cpp 中使用相同的变量(包括foo.h)。

在 VS2008 和 VS2010 下我得到unresolved external symbol 错误,而在带有 gcc 的 Ubuntu 下编译成功。

(即我正在尝试编译以下源码:http://www.fromdual.com/using-mysql-user-defined-functions-udf;foo.h指的是srv0srv.h,bar.cpp指的是源代码。所有include都到位,编译成功,链接跌倒)

可能是什么问题?

【问题讨论】:

    标签: c++ mysql user-defined-functions


    【解决方案1】:

    extern 关键字向编译器表明它后面的变量已经在其他地方声明。它实际上并没有为变量分配空间。如果您想创建一个可以通过包含头文件来使用的全局变量(顺便说一句,这通常是一个坏主意),您可以通过以下方式进行。

    在 foo.h 中:

    extern int myVar;
    

    在 foo.cpp 中:

    int myVar;
    

    myVar 现在位于 foo.cpp 中,但 foo.h 中的 extern 语句允许其他文件(例如 bar.cpp)中的代码通过包含 foo.h 来访问它。

    【讨论】:

      【解决方案2】:

      当您使用extern 声明一个变量(其他源对象或文件中的全局变量)时,您实际上是告诉编译器在其他地方查找该变量的定义。在这种情况下,您需要提供另一个定义int myVar 的源文件。

      【讨论】:

        【解决方案3】:

        您的变量必须在某个源文件中的某处有引用。通过extern 关键字,您只是在告诉“有一个变量”,但链接器必须知道它的位置。在编译源代码时,它将为变量等创建引用。链接器将根据这些引用进行链接。如果没有实际创建变量的引用,链接器将无法找到该引用,因此会报错。如果您使用extern,您的意思是不要在此处创建对此变量或任何其他内容的引用。但是必须在其他地方引用它。

        【讨论】:

        • 谢谢!什么我不明白,为什么代码在VS2010中可以编译,但是没有链接,为什么在linux下可以和gcc一起工作?
        【解决方案4】:

        问题是,必须从 dll 中导出(通过 dllspec)上述符号,才能从外部看到。只有 extern 关键字不允许从外部看到它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-14
          • 2020-04-14
          相关资源
          最近更新 更多