无法将类编译到自己的二进制文件中以便以后链接

时间:2014-01-05 06:32:46

标签: c++ gcc linker makefile

我正在尝试将多个类编译到他们自己的二进制文件中,以便稍后在链接期间使用。我有以下文件:

Gradebook.h

#ifndef GRADEBOOK_H
#define GRADEBOOK_H

class Gradebook {
  public:
    Gradebook(double);
    Gradebook();
    void setGrade(double);
    double getGrade();

  private:
    double currentGrade;
};

#endif

Gradebook.cpp

#include "Gradebook.h"
Gradebook::setGrade(double grade){
    currentGrade = grade;
}

Gradebook::getGrade(){
    return currentGrade;
}

Gradebook::Gradebook(double grade){
    currentGrade = grade;
}

Gradebook::Gradebook(){}

当我尝试编译时:

$ g++ -c Gradebook.cpp

我收到以下错误:

Gradebook.cpp:2:12: error: C++ requires a type specifier for all declarations
Gradebook::setGrade(double grade){
~~~~~~~~~  ^
Gradebook.cpp:3:3: error: use of undeclared identifier 'currentGrade'
  currentGrade = grade;
  ^
Gradebook.cpp:6:12: error: C++ requires a type specifier for all declarations
Gradebook::getGrade(){
~~~~~~~~~  ^
Gradebook.cpp:7:10: error: use of undeclared identifier 'currentGrade'
  return currentGrade;

有人可以告诉我我做错了什么吗?感谢

更新:

现在我已经编译了,因为我在cpp文件中指定了返回类型但是,当我尝试将所有内容链接在一起时,我会收到更多错误。我使用以下makefile:

all : main.o Gradebook.o
        g++ main.o Gradebook.o -o build

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

Gradebook.o: Gradebook.cpp
        g++ -c Gradebook.h

clean:
        rm -rf *.o build

run:
        ./build

当我运行make时出现以下错误:

ld: warning: ignoring file Gradebook.o, file was built for unsupported file format ( 0x43 0x50 0x43 0x48 0x01 0x0C 0x00 0x00 0x27 0x08 0x00 0x00 0x0B 0x02 0x68 0x42 ) which is not the architecture being linked (x86_64): Gradebook.o
Undefined symbols for architecture x86_64:
  "Gradebook::getGrade()", referenced from:
      _main in main.o
  "Gradebook::setGrade(double)", referenced from:
      _main in main.o
  "Gradebook::Gradebook(double)", referenced from:
      _main in main.o
  "Gradebook::Gradebook()", referenced from:
      _main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

2 个答案:

答案 0 :(得分:4)

您必须指定方法的返回类型。

void Gradebook::setGrade(double grade){
    currentGrade = grade;
}

double Gradebook::getGrade(){
    return currentGrade;
}

GradeBook.o的make规则错误,您正在编译.h文件。试试这个:

Gradebook.o: Gradebook.cpp
        g++ -c Gradebook.cpp

答案 1 :(得分:1)

您的makefile中的某个构建配方存在问题:

Gradebook.o : Gradebook.cpp
    g++ -c Gradebook.h

在构建翻译单元时,您要编译.cpp文件,而不是将头文件编译为独立文件。当前的设置将不包括您的类的方法实现,因为永远不会编译gradebook.cpp

请改为尝试:

Gradebook.o : Gradebook.cpp
    g++ -c $^ -o $@