2012-11-22 3 views
0

Можно создать дубликат:
Undefined symbols for architecture i386:C++ Ошибка компиляции - неопределенные символы для архитектуры x86_64

using namespace std; 
#include <iostream> 
#include <fstream> 
#include <string> 
#include "CorpusExp.h" 

int main(int argc, char* argv[]){ 
ifstream infile("../DATA.txt"); 
string train_dir; // The training data directory 
infile>>train_dir; 
train_dir=train_dir.substr(6,train_dir.length()); 

if (argc>1){ 
    if (strcmp(argv[1],"-s")){ // enter into CorpusExploration mode 
     CorpusExp ce(train_dir,"all"); //<<=======LINE X!!!!!!!! 
     //ce.calculate(); 
     if (argc>=3 && strcmp(argv[2],"-u")){ // check user stats 
      cout<<"shit"; 
     } 
     else if (argc>=3 && strcmp(argv[2],"-m")){ // check movie stats 

     }else{ // check the all (default) stats 

     } 
    }else if(strcmp(argv[1],"-m")) {// enter into Recommendation mode 

    } 
} 

return 0; 
} 

Если я включаю строчный, то main.cpp не будет компилировать, сообщение об ошибке:

 Undefined symbols for architecture x86_64: 
    "CorpusExp::CorpusExp(std::basic_string<char, std::char_traits<char>,  std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)", referenced from: 
     _main in main.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 
make: *** [recommend] Error 1 

А вот мой CorpusExp.cpp и CorpusExp.h:

/* CorpusExporater заголовок файла Используется для статистических целей

*/

using namespace std; 
#include <iostream> 
#include <fstream> 
#include <string> 
#include <dirent.h> // the Linux library to read the directories 

class CorpusExp{ 
public: 
    CorpusExp(const string&,const string&); // (dir_name, mode) 
    void calculate(); 
    void display(ostream &out, const int&); // print out the id's stat information 

private: 
    string _dir_name; 
    int _movie_count; 
    int _user_count; 
    int _movie_rated_count[5]; // times of movie rated as 1,2,3,4,5 
    float _movie_avg; // total moview average rates 
    string _mode; // the mode of current task 
    int _id; // the id of current task 

}; 

/*CorpusExporater cpp file 
    Used for statistical purpose 

*/ 
#include "CorpusExp.h" 

CorpusExp::CorpusExp(const string &dir_name, const string &mode): 
    _dir_name(dir_name), 
    _mode(mode), 
    _movie_count(0), 
    _user_count(0) 
{ 


} 

void CorpusExp::calculate(){ 
    DIR *dpdf; 
    struct dirent *epdf; 

    dpdf = opendir(strdup(_dir_name.c_str())); 
    if (dpdf!=NULL){ 
     while(epdf = readdir(dpdf)){ 
      cout<<epdf->d_name<<endl; 
     } 
    } 
} 
void CorpusExp::display(ostream &out, const int &id){ 

} 

Я едва новичок C++, поэтому я очень запутался, не знаю, какая часть вызвала эту проблему. Если удалить строчный, все будет просто отлично, но если я объявить класс CorpusExp в основной функции, то она не компилируется ......

здесь файл компиляции:

# Makefile for Movie Recommendation--- HW5 of Search Engine 11-641 
# Yitong Zhou 
# Nov 19, 2012 

#source code directory: 
src=src 
#obj code directory: 
obj=obj 


recommend: $(obj)/main.o $(obj)/CorpusExp.o 
    g++ -o [email protected] $< 
$(obj)/main.o: src/main.cpp src/CorpusExp.cpp 
    g++ -c $< -o [email protected] 
$(obj)/CorpusExp.o: $(src)/CorpusExp.cpp $(src)/CorpusExp.h 
    g++ -c $< -o [email protected] 

clean: 
    rm -rf obj/*.o recommend 
+0

Как выглядит вызов компилятора? – Xeo

+0

Похоже, вы не компилируете * и не связываете * ваш файл 'CorpusExp.cpp' в своей программе. определение заголовка и включение позволяет 'main.cpp' компилироваться, но без кода из скомпилированного' CorpusExp.cpp' у вас будут нерешенные внешние. – WhozCraig

+0

Вы компилируете схож с этим: g ++ main.cpp CorpusExp.cpp -o program – Chimera

ответ

1

Попробуйте выполнить простую командную строку без make-файла, чтобы убедиться, что сам make-файл не является проблемой.

cd src; g++ main.cpp CorpusExp.cpp -o recommend 
+0

Получил ли ваш файл makefile работу или вам нужна помощь? – Chimera

Смежные вопросы