2013-01-06 117 views
0

嗨我試圖按照斯坦福cs106/x課程,但他們使用某些他們不再提供的庫。我已經設法找到他們的一個版本,但我經常得到一個錯誤。我加了.h文件到當前項目中,我使用它們 這是C++運行簡單的代碼IM:Xcode Apple Mach-O鏈接器(ld)錯誤

#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 OS X 10.8.2上運行Xcode 4.5.2。如果有人知道如何解決這個問題,那將會很有幫助。

+1

'#define main()Main()' - 你認真嗎? – 2013-01-06 13:28:42

回答

0

.h文件只聲明存在某些函數。要將你的程序與他們聯繫起來,你需要有這些功能的實際實現。

對於每個.h文件,都應該有一個匹配的.c或者.cpp文件,這些文件將包含在您的構建中。 (或者,如果它分佈爲二進制,.a或.dylib。)