【问题标题】:Error in compiling C++ code?编译 C++ 代码时出错?
【发布时间】:2011-01-22 14:56:51
【问题描述】:

这是我的test.cpp

#include <iostream.h>
class C {
public:
C();
~C();
};

int main()
{
C obj;
return 0;
}

当我使用命令g++ test.cpp 编译它时,我收到以下错误消息:

在 /usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/backward/iostream.h:31 包含的文件中, 来自 test.cpp:1: /usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/backward/backward_warning.h:32:2: 警告:#warning 此文件至少包含一个已弃用或过时的标头。请考虑使用 C++ 标准第 17.4.1.2 节中的 32 个标头之一。示例包括将标头替换为 C++ 包含的标头,或者代替已弃用的标头。要禁用此警告,请使用 -Wno-deprecated。 /cygdrive/c/Users/aswinik_sattaluri/AppData/Local/Temp/ccoYkiAS.o:test.cpp:(.text+0x131): 未定义对“C::C()”的引用 /cygdrive/c/Users/aswinik_sattaluri/AppData/Local/Temp/ccoYkiAS.o:test.cpp:(.text+0x13c): 未定义对“C::~C()”的引用 collect2: ld 返回 1 个退出状态

使用gcc test.cpp 编译会得到类似的消息,甚至更多:

在 /usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/backward/iostream.h:31 包含的文件中, 来自 test.cpp:1: /usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/backward/backward_warning.h:32:2: 警告:#warning 此文件至少包含一个已弃用或过时的标头。请考虑使用 C++ 标准第 17.4.1.2 节中的 32 个标头之一。示例包括将标头替换为 C++ 包含的标头,或者代替已弃用的标头。要禁用此警告,请使用 -Wno-deprecated。 /cygdrive/c/Users/aswinik_sattaluri/AppData/Local/Temp/cc3ntGx0.o:test.cpp:(.text+0xd): 未定义引用`std::basic_string, std::allocator >::size() const ' /cygdrive/c/Users/aswinik_sattaluri/AppData/Local/Temp/cc3ntGx0.o:test.cpp:(.text+0x60): 未定义引用`std::basic_string, std::allocator >::operator[](无符号整数)常量' /cygdrive/c/Users/aswinik_sattaluri/AppData/Local/Temp/cc3ntGx0.o:test.cpp:(.text+0x9f): 未定义引用`std::basic_string, std::allocator >::operator[](无符号整数)常量' /cygdrive/c/Users/aswinik_sattaluri/AppData/Local/Temp/cc3ntGx0.o:test.cpp:(.text+0xce): 未定义引用`std::basic_string, std::allocator >::operator[](无符号整数)常量' /cygdrive/c/Users/aswinik_sattaluri/AppData/Local/Temp/cc3ntGx0.o:test.cpp:(.text+0x131): 未定义对“C::C()”的引用 /cygdrive/c/Users/aswinik_sattaluri/AppData/Local/Temp/cc3ntGx0.o:test.cpp:(.text+0x13c): 未定义对“C::~C()”的引用 /cygdrive/c/Users/aswinik_sattaluri/AppData/Local/Temp/cc3ntGx0.o:test.cpp:(.text+0x165): 未定义引用`std::ios_base::Init::Init()' /cygdrive/c/Users/aswinik_sattaluri/AppData/Local/Temp/cc3ntGx0.o:test.cpp:(.text+0x180): 未定义引用`std::ios_base::Init::~Init()' collect2: ld 返回 1 个退出状态

注意我没有设置LD_LIBRARY_PATH:

bash-3.2$ 回声 $LD_LIBRARY_PATH 重击 3.2$

【问题讨论】:

  • 正确格式化您的代码(请下次使用预览!)。仍然 - 有什么问题?
  • 所有标准 C++ 头文件都没有扩展名。

标签: c++ gcc g++ compiler-errors


【解决方案1】:

您已声明C 构造函数和析构函数的存在,但尚未提供实现。试试:

class C {
public:
    C() {}
    ~C() {}
};

并且,对于 C++ 程序,使用 g++ 进行编译(就像您的第一次尝试一样)。

【讨论】:

    【解决方案2】:

    替换

    #include <iostream.h>
    

    通过

    #include <iostream>
    

    并提供 C 类的构造函数和析构函数的实现,至少是空的。

    【讨论】:

      【解决方案3】:

      由于您没有提供实际问题,我不得不猜测您想知道什么。无论如何,我的 2c 是:

      • 不要使用iostream.h,该标题是预标准的并且已经过时了。请改用&lt;iostream&gt;
      • 您没有为C 的构造函数和析构函数提供任何实现,这正是链接器所抱怨的。

      【讨论】:

      • +1,第一个人说为什么你应该更喜欢iostream而不是iostream.h,而不是仅仅说你应该。
      【解决方案4】:

      你需要定义你的 C 构造函数和析构函数:

      C::C()
      {
      }
      
      C::~C()
      {
      }
      

      另外,坚持使用 g++ 编译。如果仔细观察,使用 gcc 编译时遇到的错误包括使用 g++ 时遇到的所有错误以及额外的错误。

      【讨论】:

        【解决方案5】:

        您包含 iostream.h 而不是 iostream,这就是您收到有关此包含的警告的原因。此外,您还为C 声明了一个构造函数和一个析构函数,但实际上并没有在任何地方实现它。因此,链接器会抱怨未定义的符号。

        你需要为C的方法添加实现,比如:

        C::C() {
          // ...
        }
        

        【讨论】:

          【解决方案6】:

          使用#include &lt;iostream&gt; 代替#include &lt;iostream.h&gt;

          你应该正确阅读错误。

          【讨论】:

            【解决方案7】:

            关于 LD_LIBRARY_PATH 的注意事项 - 它在编译或链接时与您无关(然后链接器将查看 -L 给出的路径和一些标准路径,如 /usr/lib)。

            运行应用程序时很重要 - 系统将首先在 LD_LIBRARY_PATH 中给出的路径中搜索共享库。

            http://www.linux.org/docs/ldp/howto/Program-Library-HOWTO/shared-libraries.html

            【讨论】:

              猜你喜欢
              • 2023-03-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-03-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多