【问题标题】:Linking files in g++在 g++ 中链接文件
【发布时间】:2011-09-25 19:40:48
【问题描述】:

最近我尝试用 g++(在 Ubuntu 上)编译一个程序。通常我使用 Dev-C++(在 Windows 上),只要我制作一个项目并将所有必要的文件放在那里,它就可以正常工作。

编译程序时出现的错误是:

$filename.cpp: undefined reference to '[Class]::[Class Member Function]'

用到的文件如下:

带有main函数的源代码(.cpp)文件。

带有函数原型的头文件。

.cpp 文件,其中包含每个函数的定义。

任何帮助将不胜感激。

【问题讨论】:

  • 如果你能发布你的代码.....这将是一个帮助......
  • Dev-C++ 是一个 IDE。默认情况下它使用 GCC 的 MinGW 端口。

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


【解决方案1】:

您可能尝试编译和链接而不是只编译源文件,或者不知何故忘记了一些东西。

变体一(所有内容都在一行中;始终重新编译所有内容):

g++ -o myexecutable first.cpp second.cpp third.cpp [other dependencies, e.g. -Lboost, -LGL, -LSDL, etc.]

变体二(循序渐进;如果没有提供-o,gcc 将重用输入文件名并在不链接时仅更改扩展名;此变体最适用于makefile;允许您跳过未更改的部分):

g++ -c first.cpp
g++ -c second.cpp
g++ -c third.cpp
g++ -o myexecutable first.o second.o third.o [other dependencies]

变体三(一些占位符):

不会列出它,但上面提到的参数也可以作为占位符,例如g++ -c *.cpp会将当前目录下的所有cpp文件编译成o(bject)个同名文件。

总体而言,除非您确实必须在没有任何 IDE 的情况下工作,否则您不必为此担心太多。如果您对命令行语法不是那么精通,请先坚持使用 IDE。

【讨论】:

    【解决方案2】:

    gcc 的命令行应该是这样的:

    g++ -o myprogram class1.cpp class2.cpp class3.cpp main.cpp
    

    检查在哪个 cpp 文件中定义了缺少的类成员函数。你可能没有把它交给 gcc。

    【讨论】:

      【解决方案3】:

      您还可以在filename.cpp 中检查正确的#include 标签。假设filename.cpp 使用包含在与filename.cpp 相同目录中的myclass.h 中的代码。假设g++所说的未定义的类包含在myclass.h中,并在myclass.cpp中定义。因此,要在filename.cpp 中正确包含myclass.h,请执行以下操作:

      1. filename.cpp:
      #include <iostream>  
      #include <myclass.h>  
      //..source code.  
      
      1. 在生成文件中:
      filename.o: myclass.C myclass.h filename.cpp
      g++ -I./ -c filename.cpp -o filename.o
      
      myclass.o: myclass.C myclass.h  
      g++ -c myclass.C -o myclass.o
      

      在上面,注意编译filename.cpp时使用-I.选项。 -I&lt;directory&gt; 要求g++-I 部分之后的路径包含到搜索路径中。这样myclass.h 就被正确包含了。

      在没有更多信息(可能是来源)的情况下,很难准确地说出问题所在。所有的尝试都将只是在黑暗中刺伤。

      【讨论】:

        【解决方案4】:

        我假设您已经声明了一个成员函数(通常在 .h.hpp 文件中)但省略了成员函数的相应定义(通常在 .cpp 文件中)。

        在c++中,可以这样声明一个类:

        class foo {
          void x();
          void y();
        }
        

        使用这样的 cpp 文件

        void foo::x() {
           do_something()
        }
        

        注意,没有foo::y()

        只要成员函数foo::y() 在整个编译代码中没有被引用,这对编译/链接过程就没有问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-01-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多