2016-10-04 103 views
-3

我正在編寫一個類項目的代碼,並且我在Xcode中完成了所有工作,這很好。我能夠在Xcode中編譯w/arguments並獲得輸出。然而,當我嘗試編譯它在終端,我不斷收到此錯誤(我也不能肯定,如果我正確編譯它):在OSX終端中編譯C++:體系結構x86_64的未定義符號

francis-mbp:CS280-Assignment1 fren$ gcc /Users/fren/Desktop/CS280-Assignment1/main.cpp -o main 
/Users/fren/Desktop/CS280-Assignment1/main.cpp:31:32: warning: in-class initialization of non-static data member is a C++11 extension [-Wc++11-extensions] 
    list<string>::iterator iter=lineToPrint.begin(); 
          ^
/Users/fren/Desktop/CS280-Assignment1/main.cpp:32:19: warning: in-class initialization of non-static data member is a C++11 extension [-Wc++11-extensions] 
    int charLimit = 60; 
       ^
2 warnings generated. 
Undefined symbols for architecture x86_64: 
    "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::compare(char const*) const", referenced from: 
     _main in main-b9d962.o 
    "std::__1::locale::has_facet(std::__1::locale::id&) const", referenced from: 
     std::__1::basic_filebuf<char, std::__1::char_traits<char> >::basic_filebuf() in main-b9d962.o 
    "std::__1::locale::use_facet(std::__1::locale::id&) const", referenced from: 
     std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in main-b9d962.o 
     std::__1::basic_filebuf<char, std::__1::char_traits<char> >::imbue(std::__1::locale const&) in main-b9d962.o 
     std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in main-b9d962.o 
     std::__1::basic_filebuf<char, std::__1::char_traits<char> >::basic_filebuf() in main-b9d962.o 
    "std::__1::ios_base::getloc() const", referenced from: 
     std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in main-b9d962.o 
     std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in main-b9d962.o 
    "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::erase(unsigned long, unsigned long)", referenced from: 
     Line::addWord(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main-b9d962.o 
    "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__init(char const*, unsigned long)", referenced from: 
     Line::addWord(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main-b9d962.o 
     Line::printLine(int) in main-b9d962.o 
     _main in main-b9d962.o 
    "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__init(char const*, unsigned long, unsigned long)", referenced from: 
     std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > std::__1::operator+<char, std::__1::char_traits<char>, std::__1::allocator<char> >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char const*) in main-b9d962.o 
    "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__init(unsigned long, char)", referenced from: 
     std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> > std::__1::__pad_and_output<char, std::__1::char_traits<char> >(std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> >, char const*, char const*, char const*, std::__1::ios_base&, char) in main-b9d962.o 
    "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::append(char const*, unsigned long)", referenced from: 
     std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > std::__1::operator+<char, std::__1::char_traits<char>, std::__1::allocator<char> >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char const*) in main-b9d962.o 
    "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::assign(char const*)", referenced from: 
     Line::addWord(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main-b9d962.o 
     _main in main-b9d962.o 
    "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::push_back(char)", referenced from: 
     _main in main-b9d962.o 
    "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from: 
     Line::addWord(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main-b9d962.o 
     std::__1::list<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::push_back(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in main-b9d962.o 
     std::__1::list<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::insert(std::__1::__list_const_iterator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, void*>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in main-b9d962.o 
     Line::checkBack() in main-b9d962.o 
     _main in main-b9d962.o 
    "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long, unsigned long, std::__1::allocator<char> const&)", referenced from: 
     Line::addWord(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main-b9d962.o 
    "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_string()", referenced from: 
     Line::addWord(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in main-b9d962.o 
     std::__1::list<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::pop_back() in main-b9d962.o 
     std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > std::__1::operator+<char, std::__1::char_traits<char>, std::__1::allocator<char> >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char const*) in main-b9d962.o 
     Line::printLine(int) in main-b9d962.o 
     std::__1::list<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::pop_front() in main-b9d962.o 

     std::__1::list<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::push_back(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in main-b9d962.o 
     std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > std::__1::operator+<char, std::__1::char_traits<char>, std::__1::allocator<char> >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char const*) in main-b9d962.o 
     std::__1::list<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::insert(std::__1::__list_const_iterator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, void*>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in main-b9d962.o 
     Line::printLine(int) in main-b9d962.o 
     Line::popBack(int) in main-b9d962.o 
     ... 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
francis-mbp:CS280-Assignment1 fren$ 

下面是我的項目的代碼(不包括的字符限制主要BC):

#include <iostream> 
#include<string> 
#include<vector> 
#include<sstream> 
#include<fstream> 
#include<algorithm> 
#include<queue> 
#include<list> 
#include<iterator> 
#include<ctype.h> 
using namespace std; 


/* 
Class defining data structure that holds linked list containing words to be output 
Contains words on a per-line basis (Empties after each line is printed) 
Handles list operations 
*/ 
class Line 
{ 
public: 
    list<string> lineToPrint; 
    list<string>::iterator iter=lineToPrint.begin(); 
    int charLimit = 60; 
    string spaceToInsert; 

    int totalChars; 
    int totalSpaces; 
    int numWords; 
    int placesForSpaces; 
    int spacePerPlace; 
    int extraSpaces; 

    void addWord (string word); 
    void reset (void); 
    void changeLimit (int newLimit); 
    void printLine (int endOfParagraph); 
    void calculateSpaces(void); 
    void newParagraph(void); 
    void popBack(int type); 
    string checkBack(void); 
}; 

void Line::addWord(string word) { 

    cout << "adding word: " << word << endl; 
    string firstHalfWord; 
    string secondHalfWord; 
    int numToTruncate; 
    int splittingWord = 1; 
    lineToPrint.push_back(word); 
    totalChars += word.length(); 
    numWords ++; 
    calculateSpaces(); 
    if(((totalChars > charLimit) && (numWords >= 1)) || ((totalSpaces < placesForSpaces) && (spacePerPlace == 0))) { 
     splittingWord = 0; 
     lineToPrint.pop_back(); 
     numToTruncate = totalChars - (charLimit - placesForSpaces - 1); 
     if(numToTruncate > word.length()) { 
      cout << numToTruncate << " " << word.length(); 
      cout << "error" << endl; 
     } else { 
      secondHalfWord = word.substr(word.length() - numToTruncate); 
      firstHalfWord = word.erase(word.length() - numToTruncate) + "-"; 
     } 
     lineToPrint.push_back(firstHalfWord); 

     totalChars -= (word.length() + secondHalfWord.length()); 

     totalChars += firstHalfWord.length(); 


     calculateSpaces(); 
    } 

    if((spacePerPlace <= 2 && extraSpaces<= placesForSpaces)||(spacePerPlace == 3 && extraSpaces == 0)) { 
     if(spacePerPlace == 1){ 
      spaceToInsert = " "; 
     } else if (spacePerPlace == 2) { 
      spaceToInsert = " "; 
     } else if (spacePerPlace == 3) { 
      spaceToInsert = " "; 
     } 

     iter++; 
     for(int j = placesForSpaces; j > 0; j--) { 
      //cout << "inserting " << spacePerPlace << " spaces!" << endl; 
      lineToPrint.insert(iter, spaceToInsert); 
      totalSpaces -= spacePerPlace; 
      if(extraSpaces != 0){ 
       lineToPrint.insert(iter, " "); 
       totalSpaces --; 
       extraSpaces --; 
      } 
      iter++; 
     } 
     printLine(1); 
    } 
    if(splittingWord == 0 && secondHalfWord.length() > charLimit){ 
     iter = lineToPrint.begin(); 
     addWord(secondHalfWord); 
    } else if (splittingWord == 0 && secondHalfWord.length() <= charLimit) { 
     lineToPrint.push_back(secondHalfWord); 
     totalChars += secondHalfWord.length(); 
     numWords ++; 
    } 
    iter = lineToPrint.begin(); 
    splittingWord = 1; 
} 

//Resets the list and variables for calculating spaces to insert 
void Line::reset(void) { 
    lineToPrint.clear(); 
    totalChars = 0; totalSpaces = 0; numWords = 0; placesForSpaces = 0; 
} 

//Changes the variable limit used in space insert calculations 
void Line::changeLimit(int newLimit) { 
    //cout << "Changing Limit to: " << newLimit << endl; 
    charLimit = newLimit; 
} 

//Makes calculations for variables used in space insertion calculations 
void Line::calculateSpaces(void) { 
    //cout << "calculating spaces..." << endl; 
    totalSpaces = charLimit - totalChars; 

    if (numWords == 1 && totalChars >= charLimit) { 
     placesForSpaces = 0; 
     spacePerPlace = 0; 
    } else { 
     if(numWords == 1){ 
      placesForSpaces = 1; 
     } else { 
      placesForSpaces = numWords - 1; 
     } 
     spacePerPlace = totalSpaces/placesForSpaces; 
     extraSpaces = totalSpaces%placesForSpaces; 
    } 

    //cout << "totalChars: "<< totalChars <<" totalSpaces: "<< totalSpaces << " numWOrds: " << numWords << " placesFOrSpaces: " << placesForSpaces << " spacePerPlace: " << spacePerPlace << " extraSpaces: " << extraSpaces << endl; 

} 

//Prints the list (with spaces included) 
//Takes int argument; 0 = end of paragraph, 1 = not end of paragraph 
void Line::printLine(int endOfParagraph) { 
    //p1cout << "character limit: " << charLimit << endl; 
    if(endOfParagraph == 1) { 
     cout << "printing line NOT end of paragraph" << endl; 
     for(list<string>::iterator it = lineToPrint.begin(); it != lineToPrint.end(); it++){ 
      cout << *it; 
      lineToPrint.pop_front(); 
     } 
    } else if (endOfParagraph == 0) { 
     iter++; 
     cout << "printing line end of paragraph" << endl; 

     if (numWords != 1) { 
      for(int i = placesForSpaces; i >0; i--) { 
       lineToPrint.insert(iter, " "); 
       iter++; 
      } 
     } 
     iter = lineToPrint.begin(); 
     for(list<string>::iterator it = lineToPrint.begin(); it != lineToPrint.end(); it++){ 
      cout << *it; 
      lineToPrint.pop_front(); 
     } 
    } 
    cout << endl; 
    totalChars = 0; totalSpaces = 0; numWords = 0; placesForSpaces = 0; 
} 

//Prints a new line to separate paragraphs 
void Line::newParagraph(void){ 
    cout << endl; 
} 

//Returns the string held in the back of the list 
string Line::checkBack(void) { 
    return lineToPrint.back(); 
} 

//Removes a string off the back of the list 
void Line::popBack(int type) { 
    if(type == 1){ 
     string wordToPop = checkBack(); 
     cout << "word to pop : " << wordToPop << endl; 
     int length = wordToPop.length(); 
     cout << "length of w2pop : " << length <<endl; 
     totalChars -= length; 
    } 
    //cout << "popping from back: " << checkBack(); 
    lineToPrint.pop_back(); 
    numWords --; 
} 

感謝任何幫助

+2

很多,很多:(... – Ven

+0

我真的不知道該做什麼:(我不知道我在做什麼錯誤,特別是因爲我從來沒有用C++編碼過。 –

+1

['using namespace std ;'](http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice) –

回答

2

你的編譯器的命令行更改爲

g++ /Users/fren/Desktop/CS280-Assignment1/main.cpp -o main 

問題是gcc將C++代碼(根據文件擴展名確定)正確編譯main.cpp,但默認情況下不會鏈接libstdc++.a。因此未定義的參考錯誤。

+0

Ahhh ok,gotcha。所以我用'g ++ -std = C++ 11 main.cpp - 主',我認爲它的工作,沒有錯誤或戰爭nings。還有一件事,我該如何傳遞參數呢?我只需要傳遞輸入文件的名稱 –

+0

@FrancisPastor你的意思是如何將參數傳遞給'main()'?有可以使用的參數'int argc'和'char * argv []'。 'argc'告訴你在命令行'argv'傳遞的參數的數量包含每一個參數。第一個參數始終是程序名稱。 –

+0

對。那麼在終端命令中,我將第二個參數放在文件名中?對不起,我不熟悉從終端 –

相關問題