C ++程序不会构建。获取未定义的符号以表示架构错误

时间:2013-10-14 14:24:46

标签: c++ gcc architecture build linker

我正在学习C ++而且正在上课。

我以为我已经正确创建了所有内容,但是当我尝试清理/构建代码时出现错误:

"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .clean-conf
rm -f -r build/Debug
rm -f dist/Debug/GNU-MacOSX/hw4


CLEAN SUCCESSFUL (total time: 57ms)

"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
"/usr/bin/make"  -f nbproject/Makefile-Debug.mk dist/Debug/GNU-MacOSX/hw4
mkdir -p build/Debug/GNU-MacOSX
rm -f build/Debug/GNU-MacOSX/karavites_william_oct7_homework.o.d
g++    -c -g -MMD -MP -MF build/Debug/GNU-MacOSX/karavites_william_oct7_homework.o.d -o build/Debug/GNU-MacOSX/karavites_william_oct7_homework.o karavites_william_oct7_homework.cpp
karavites_william_oct7_homework.cpp: In function 'void insertAtEnd(int)':
karavites_william_oct7_homework.cpp:85: warning: NULL used in arithmetic
mkdir -p build/Debug/GNU-MacOSX
rm -f build/Debug/GNU-MacOSX/main.o.d
g++    -c -g -MMD -MP -MF build/Debug/GNU-MacOSX/main.o.d -o build/Debug/GNU-MacOSX/main.o main.cpp
mkdir -p dist/Debug/GNU-MacOSX
g++     -o dist/Debug/GNU-MacOSX/hw4 build/Debug/GNU-MacOSX/karavites_william_oct7_homework.o build/Debug/GNU-MacOSX/main.o 
Undefined symbols for architecture x86_64:
  "BookList::printerr()", referenced from:
      _main in main.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make[2]: *** [dist/Debug/GNU-MacOSX/hw4] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2


BUILD FAILED (exit value 2, total time: 469ms)

我在项目中有3个文件:

  • 的main.cpp
  • karavites_william_oct7_homework.cpp
  • karavites_william_oct7_homework.h

我有头文件中定义的函数和类,以及类(class.cpp)文件中的一个简单方法,它只打印出一个字符串来测试所有内容。

这是我的主文件看起来调用/创建类:

#include <cstdlib>
#include "karavites_william_oct7_homework.h"
#include <iostream>

using namespace std;
using std::cout;
using std::cin;

int ch;

/*
 * 
 */


int getNum(int cho) {
    int ans;
    switch (cho) {
        case 1: cout << "Please type in the ISBN you wish to search\\insert\\delete\n";
            cin >> ans;
            break;
        case 2: cout << "Please type in the position of the element you wish to delete/insert\n";
            cin >> ans;
            break;
    }

    return ans;

}

int main(int argc, char** argv) {
    BookList bl;


    bl.printerr();

    return 0;
}

class1.h

/* 
 * File:   karavites_william_oct7_homework.h
 * Author: willkara
 *
 * Created on October 7, 2013, 9:21 PM
 */



#ifndef KARAVITES_WILLIAM_OCT7_HOMEWORK_H
#define KARAVITES_WILLIAM_OCT7_HOMEWORK_H
#include <vector>

class BookList {
public:
    BookList();


    void insertAtEnd(int new_element);
    void insertAtLocation(int new_element, int pos);
    int linSearch(int isbn);
    int binSearch(int element);
    void deleteByPosition(int position);
    void deleteByItem(int item);
    void printerr();

    void print();
    int menu();
    int countCurrent();
    void bubbleSort();
    void fixNulls();
    void selectionSort();

private:

    static int lSize;

    int bList[20];
    bool sorted;
    int p;

};

#endif  /* KARAVITES_WILLIAM_OCT7_HOMEWORK_H */

booklist类有很多方法,但是我甚至无法得到一个打印出一行的简单方法。

#include "karavites_william_oct7_homework.h"
#include <iostream>

using namespace std;
using std::cout;
using std::cin;

int bList[20];
int lSize = 20;
bool sorted;
int c;

BookList::BookList() {

}


void printerr() {
    cout << "I will hopefully work this time.\n";
}

我在某个地方错过了声明吗?我在mac OSX 10.7.5上使用NetBeans 7.3.1进行开发。

1 个答案:

答案 0 :(得分:2)

应该是:

void BookList::printerr() {
    cout << "I will hopefully work this time.\n";
}

注意BookList::,即您忘记在实现/定义期间指定方法所属的类。因此,编译器认为这只是一个全局函数printerr,但您在main内将其称为类的方法,因此编译器在链接期间无法找到BookList::printerr的实现阶段并报告错误。

关于术语的重要评论(你在评论中混合了),方法的声明是这样的:

class BookList {
    ...

    void printerr();

    ...
};

即。该方法刚刚声明,未定义/实现。

方法的

定义/实施是:

void BookList::printerr() {
    ...
}

这完全是声明定义/实现

class BookList {
    ...

    void printerr() {
        ...
    }

    ...
};

在这种情况下,您不需要指定BookList::,因为编译器已经知道您在printerr类中定义/实现了BookList方法。