2016-06-09 5 views
1

Я очень новичок в C++, если не сказать больше. Однако я не могу найти ответ на этот конкретный вопрос в любом месте.C++ странное поведение

Это тоже не кодекс, так как я пытался загрузить много кода и скомпилировать его с помощью g ++ или просто сделать.

Кажется, что всякий раз, когда я включить класс заголовка в моем main() он бросает ошибку компоновщика:

Undefined symbols for architecture x86_64: 

    "House::getNumBath()", referenced from: 
     printHouse(House) in houses-91268b.o 
    "House::getSqft()", referenced from: 
     printHouse(House) in houses-91268b.o 
    "House::getColor()", referenced from: 
     printHouse(House) in houses-91268b.o 
    "House::House(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int, int, double)", referenced from: 
     _main in houses-91268b.o 
    "House::House()", referenced from: 
     _main in houses-91268b.o 
    "House::~House()", referenced from: 
     _main in houses-91268b.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

Это не происходит независимо от того, какой код нужно скачать или производить и, кажется, связана с функцией конструктора реализованного как MyClass :: MyClass (/ * args * /);

Кто-то предложил, что я должен включить .cpp файл в моем файле main вместо .h, да это работает. Но это очень неправильно, поскольку меня всегда учили, что интерфейсы предназначены для этого. В противном случае, какова их цель?

С предложением другого человека (googled), теперь я загружаю Xcode на 10 ГБ и надеюсь, что это поможет. Кажется, похоже, что это не сработает. Что не так с C++ здесь? Я почему-то пропустил C++ 11 (опять же, почему на относительно новой ОС?)?

UPDATE:

Я схватил код с другой учебник, который бросает мне то же самое:

dog.cc

#include "Dog.h" 


    Dog::Dog() { 


    } 

dog.h

#ifndef DOG_H 
    #define DOG_H 


    class Dog { 
     public: 
      Dog(); 
     protected: 
     private: 

    }; 

    #endif 

main.cc

#include "Dog.h" 


    int main() { 

    Dog barky; 

    return 0; 

} 

Броски как же после того, как я делал (они находятся в той же папке, те):

g++ main.cc 

или

make ./main 

Это, вероятно, самый простой пример, который я хотел бы попробовать, так как у меня никогда не было таких проблем, как раньше, в C, либо с использованием Makefile, либо просто с cc файлом.

+0

смог собрать и связать наименьшую программу C++ Вы? 'int main() {}' – Casey

+0

да, это возможно. пока я не делаю MyClass :: MyClass()/вызов конструктора –

+1

Покажите нам определение и реализацию класса дома и определение и реализацию MyClass. – Casey

ответ

3

Вы должны скомпилировать объект (dog.o файл) первый:

g++ -c dog.cc 

Затем компилировать основной с ним:

g++ main.cc dog.o 
+0

Или просто скомпилируйте оба файла .cc в одно и то же время или используйте Makefile для управления процессом компиляции ... –

+0

Спасибо. Проблема в том, что 99% обучающих программ там используют Visual Studio или Eclipse, которые делают это за вас. Оба из них, IDE, я отказываюсь использовать в течение некоторого времени по крайней мере. В конце концов, вряд ли кто-нибудь объяснит правильные шаги. Я простой пользователь текстового редактора (VIM/tmux или Sublime text), и это не происходит автоматически при использовании ни одного из них (очевидно). –