0

こんにちは私はスタンフォードcs106/xコースをたどろうとしていますが、彼らはもはや提供していない特定のライブラリを使用しています。それらのバージョンを見つけることができましたが、常にエラーが発生します。.hファイルを、それらを使用していた現在のプロジェクトに追加しました。これは、C++で実行されている単純なコードです。

#include <iostream>
#include "genlib.h"
#include "simpio.h"


int main()
{
    cout << "How much do you love me? ";
    int howAweSome = GetInteger();
    for (int i = 0; i < howAweSome; i++)
    cout << "10GB rocks!" << endl;
    return 0;
}

次のエラーが発生します。

Undefined symbols for architecture x86_64:
"GetInteger()", referenced from:
  Main() in main.o
"_main", referenced from:
 -u command line option
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

使用されるライブラリは次のとおりです。

"simplio.h":

/*
* File: simpio.h
* Last modified on Wed Jul 22 07:01:03 2009 by eroberts
*      modified on Wed Sep 18 13:34:29 2002 by zelenski
* -----------------------------------------------------
* This interface provides access to a simple package of
* functions that simplify the reading of console input.
*/

#ifndef _simpio_h
#define _simpio_h

#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 retry.
*/

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

「genlib.h」:

/*
 * File: genlib.h
 * Last modified on Sun Jul 17 2011 by Colin Leach
 *      modified on Mon Jun  8 20:16:05 2009 by eroberts
 *      modified on Wed Sep 18 13:41:31 2002 by zelenski
 * -----------------------------------------------------
 * 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.
 *
 * IMPORTANT!!  I had to change the interface after failing to
 * implement the Stanford version. Hence the genlib.h bundled
 * with CS106B exercises is NOT compatible - don't use it with 
 * Colin's open-source library code.
 * Apologies for the inconvenience, but I'm a C++ novice doing
 * the best I can.
 */

 #ifndef _genlib_h
 #define _genlib_h

 /* This strange-looking pragma is here to disable a warning from Visual C++
 * about truncating long identifiers for debugging symbols. The warning is
 * harmless, but a little disconcerting, so we suppress it. It comes up
 * using STL and other long template expansions.
 */
 #if defined(_MSC_VER)
 #pragma warning(disable: 4786)
 #endif

 #include <string>
 #include <exception>
 using namespace std;

 /*
 * Class: ErrorException
 * ---------------------
 * This exception is raised by calls to the Error function, which
 * makes it possible for clients to respond to error conditions
 * without having their programs bomb completely.
 */

 class ErrorException : public exception {
 public:
    ErrorException(string msg);
     virtual ~ErrorException() throw ();
     virtual const char* what() const throw ();
     //virtual string getMessage();
 private:
  string msg;
 };

/*
* Function: Error
* Usage: Error(msg);
* ------------------
* Error is used to signal an error condition in a program.  It first
* throws an ErrorException.  If that isn't caught, it outputs the
* error message string to the cerr stream and then exits the program
* with a status code indicating failure.
*/

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.
*
* Note that this non-Stanford version only affects the zero-argument
* form of main(), not main(int argc, char* argv[]).
* If you want to use command-line arguments, you also have to catch
* your own ErrorException - see init.h/init.cpp for details.
*/

 #define main() Main()

 #endif

Macbook Pro OSX10.8.2でXcode4.5.2を実行しています。誰かが問題を解決する方法を知っているなら、それは大きな助けになるでしょう。

4

1 に答える 1

0

.hファイルは、特定の関数が存在することを宣言するだけです。プログラムをそれらにリンクするには、それらの関数の実際の実装が必要です。

.hファイルごとに、ビルドに含める一致する.cまたは.cppが必要です。(または、バイナリとして配布された場合は、.aまたは.dylib。)

于 2013-01-06T13:23:57.040 に答える