
一共 5 个文件在同一文件夹。
- main.cpp
- genlib.h
- genlib.cpp
- simpio.h
- simpio.cpp
可是编译的时候说找不到 GetInteger(),可是我明明在 simpio.cpp 里定义了啊。
$ g++ main.cpp
Undefined symbols for architecture x86_64:
"GetInteger()", referenced from:
_main in main-32d6b5.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
文件如下。
/* * File: mian.cpp * -------------- */ #include <iostream> #include "genlib.h" #include "simpio.h" int main() { int total; total = GetInteger(); cout << "The total is " << total << "." << endl; return 0; } #ifndef GENLIB_H_ #define GENLIB_H_ /* * File: genlib.h * Version: 1.0CPP * Last modified on Wed Sep 18 13:41:31 PDT 2002 by jzelenski * ---------------------------------------------------------- * This header file is indicated to be included in * all the programs written for CS106B/X and provides a few * common definitions. Note this header has a "using namespace std" * clause. If a file includes this header, it can then use * features from the std namespace without qualifying by scope. */ #include <string> using namespace std; /* * Function: Error * Usage: Error(msg) * ------------------ * Error outputs an error string to the cerr stream and * then throws a string exception corresponding to the error. */ void Error(string str); // /* // * Function macro: main // * -------------------- // * The purpose of this macro definition is to rename the student // * main to Main in order to allow a custom main defined in our // * libraries to configure the application before passing control // * back to the student program. // */ // #ifdef __APPLE__ // #define main Main // #endif #endif /*GENLIB_H_*/ /* * File: genlib.cpp * Last modified September 2011 by Colin * ---------------- * This file implements the genlib.h interface * It is needed by programs using the Stanford CS106B libraries * If the ErrorException is unhandled by student code, it will * be caught by init.cpp code, which wraps around the student's * main() function */ #include "genlib.h" #include <cstdlib> #include <iostream> ErrorException::ErrorException(string m="unspecified custom error") : msg(m) { } ErrorException::~ErrorException() throw() {} const char* ErrorException::what() const throw() { return this->msg.c_str(); } void Error(string str) { ErrorException err(str); throw err; } #ifndef SIMPIO_H_ #define SIMPIO_H_ /* * File: simpio.h * Version: 1.0CPP * Last modified on Wed Sep 18 13:34:29 PDT 2002 by jzelenski * ---------------------------------------------------------- * This interface provides access to a simple package of * functions that simplify the reading of console input. */ #include "genlib.h" /* * Function: GetInteger * Usage: n = GetInteger(); * ------------------------ * GetInteger reads a line of text from standard input and scans * it as an integer. The integer value is returned. If an * integer cannot be scanned or if more characters follow the * number, the user is given a chance to rety. */ int GetInteger(); /* * Function: GetLong * Usage: n = GetLong(); * --------------------- * GetLong reads a line of text from standard input and scans * it into a long integer. The long is returned. If the * number cannot be scanned or if extra characters follow it, * the user is given a chance to retry. */ long GetLong(); /* * Function: GetReal * Usage: x = GetReal(); * --------------------- * GetReal reads a line of text from standard input and scans * it as a double. If the number cannot be scanned or if extra * characters follow after the number ends, the user is given * a chance to reenter the value. */ double GetReal(); /* * Function: GetLine * Usage: s = GetLine(); * --------------------- * GetLine reads a line of text from standard input and returns * the line as a string. The newline character that terminates * the input is not stored as part of the string that is returned. */ string GetLine(); #endif /*SIMPIO_H_*/ /* File : simpio.cpp * Last modified September 2011 by Colin * * Based on the discussion in the CS106L Course Reader, chapter 3 * http://www.stanford.edu/class/cs106l/course_reader.html */ #include <iostream> #include <sstream> #include "genlib.h" /* * Function: GetLine * Usage: s = GetLine(); */ string GetLine() { string result; getline(cin, result); if (cin.fail()) { result = ""; cin.clear(); } return result; } /* * Function: GetInteger * Usage: n = GetInteger(); */ int GetInteger() { while(true) { stringstream converter; converter << GetLine(); int result; if (converter >> result) { char remaining; if(converter >> remaining) cout << "Unexpected character: " << remaining << endl; else return result; } else cout << "Please enter an integer." << endl; } } /* * Function: GetLong * Usage: n = GetLong(); */ long GetLong() { while(true) { stringstream converter; converter << GetLine(); long result; if(converter >> result) { char remaining; if(converter >> remaining) cout << "Unexpected character: " << remaining << endl; else return result; } else cout << "Please enter an integer (long)." << endl; } } /* * Function: GetReal * Usage: x = GetReal(); */ double GetReal() { while(true) { stringstream converter; converter << GetLine(); double result; if (converter >> result) { char remaining; if (converter >> remaining) cout << "Unexpected character: " << remaining << endl; else return result; } else cout << "Please enter a floating-point number."; } } 1 omengye 2016 年 2 月 16 日 via Android 关键词: g++ 多个源文件 |
3 matthewgao 2016 年 2 月 16 日 原因是你只编译了 main.cpp ,但是没编译其他的源文件,所以在连接的时候找不到 getInteger |