【问题标题】:Simple C++ program help compiling简单的C++程序帮助编译
【发布时间】:2011-02-05 20:17:42
【问题描述】:

伙计们,我是一名初级程序员,需要帮助。我正在处理位于此处的作业的 A 部分:http://cs.binghamton.edu/~sgreene/cs240-2010f/labs/lab2.html

但是我在编译我的程序时遇到了问题。请告诉我在我的makefile 和cpp 文件中我做错了什么!这是我的文件:

# CS240 Lab2 Makefile 

all: lab2

lab2: lab2.o
    g++ -Wall lab2.o -o lab2

lab2.o: main.cpp
    g++ -Wall -c main.cpp -o lab2.o

lab2.o: tenstrings.cpp
    g++ -Wall -c tenstrings.cpp -o lab2.o

/*tenstrings.h*/
#ifndef TENSTRNGS
#define TENSTRNGS

class TenStrings
{
public: 
    // Default Constructor
    TenStrings();
}
#endif

/* tenstrings.cpp */

#include "TenStrings.h"

//Default Constructor
TenStrings::TenStrings()
{}

/* main.cpp */

#include "TenStrings.h"

int main()
{
    TenStrings varTen;
    return 0; 
}

正如你所看到的,这甚至不是一个程序,它只是为了让我开始编译,但我遇到了一堆错误:

________________________________________________________________________________________
Makefile:12: warning: overriding commands for target 'lab2.o'
Makefile:9: warning: ignoring old commands for target 'lab2.o'
g++ -Wall -c tenstrings.cpp -o lab2.o
In file included from tenstrings.cpp:6:
TenStrings.h:11:3: warning: no newline at end of file
tenstrings.cpp:7: error: new types may not be defined in a return type
tenstrings.cpp:7: error: return type specification for constructor invalid
_________________________________________________________________________________________

提前致谢!

【问题讨论】:

标签: c++ makefile compiler-errors


【解决方案1】:

我认为你的 makefile 应该看起来更像这样:

all: lab2

lab2: main.o tenstrings.o
    g++ main.o tenstrings.o -o lab2

main.o: main.cpp
    g++ -Wall -c main.cpp -o main.o

tenstrings.o: tenstrings.cpp
    g++ -Wall -c tenstrings.cpp -o tenstrings.o

这可能会解决您的前两个错误。

【讨论】:

  • 差不多 - 摆脱 lab2.o
  • 谢谢。它终于编译了,但我仍然收到一条消息:TenStrings.h: warning: no newline at end of file .. 我知道这只是一个警告,但我应该担心这里有什么吗?
  • 是的,在文件末尾添加一个新行。你可能会发现分号后面什么都没有。去那里然后按回车键。
  • 谢谢。在我在实验室作业的原始帖子中给出的那个链接上,实验室的 B 部分是什么意思?我是否必须在我的 tenstrings.cpp 文件中创建一个空字符串数组?还是我必须说 CONST string1 = ""、CONST string2 = "" 等等。不过,我对 [] 感到困惑。谢谢
  • 我不确定您不了解其中的哪一部分。所以,简单地说 - 您需要一个字符串数组(您为其分配内存的指针,或固定长度,使其成为二维数组)作为 TenStrings 类中的私有成员。这就是方括号的用途,例如[10]。所以你的第一个字符串是string[0],第十个是string[9]。然后像 strcpy (string[0], "First string"); (或者如果你使用一个字符串类,它的等价物)等,在构造函数中。
【解决方案2】:

在类声明的末尾需要一个分号。此外,您可以更简单地重写您的 Makefile;您不需要为每个文件指定一个目标:

all: lab2

lab2: lab2.o
    g++ -Wall lab2.o -o lab2

lab2.o: main.cpp tenstrings.cpp
    g++ -Wall -o lab2.o tenstrings.cpp main.cpp

【讨论】:

  • 如果您要一次性处理所有源文件(对于像这样的小案例很好,对于一打很傻,对于数百个很愚蠢),那么构建目标文件就没有什么意义了然后是可执行文件:您可以制作可执行文件。但是正确地做(每个源文件都提供一个目标文件,然后链接.o)只是为了练习。
  • 谢谢。它终于编译了,但我仍然收到一条消息:TenStrings.h: warning: no newline at end of file .. 我知道这只是一个警告,但我应该担心这里有什么吗?
  • btw..你给我的这个makefile不起作用..但是分号确实有帮助
【解决方案3】:

你不能用';'来终止 TenStrings 类在 TenStrings.h 的末尾,这就是错误所在。

【讨论】:

  • 谢谢。它终于编译了,但我仍然收到一条消息:TenStrings.h: warning: no newline at end of file .. 我知道这只是一个警告,但我应该担心这里有什么吗?
  • 是的,在文件末尾添加一个新行。你可能会发现分号后面什么都没有。去那里然后按回车键。
【解决方案4】:

您在类声明的末尾缺少一个分号。

【讨论】:

    【解决方案5】:

    我认为您在类定义的末尾忘记了分号。

    /*tenstrings.h*/
    #ifndef TENSTRNGS
    #define TENSTRNGS
    
    class TenStrings
    {
    public: 
        // Default Constructor
        TenStrings();
    }; // <--- !!!!
    #endif
    

    【讨论】:

      【解决方案6】:

      您定义了两次相同的make 目标。然后,您不会链接项目的所有部分。这应该是这样的:

      all: lab2
      
      lab2: lab.o lab2.o
          g++ -Wall lab.o lab2.o -o lab2
      
      lab.o: main.cpp
          g++ -Wall -c main.cpp -o lab.o
      
      lab2.o: tenstrings.cpp
          g++ -Wall -c tenstrings.cpp -o lab2.o
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-23
        相关资源
        最近更新 更多