2009-03-26 4 views
4

Я не могу получить этот простой кусок кода для компиляции без включения файла TestClass.cpp явно в файл main.cpp. Что я делаю не так? Заранее спасибо!C++ Undefined Reference (Even with Include)

Вот код:

TestClass.h

#ifndef TESTCLASS_H_ 
#define TESTCLASS_H_ 

class TestClass 
{ 
    public: 
     static int foo(); 
}; 

#endif 

TestClass.cpp

#include "TestClass.h" 

int TestClass::foo() { return 42; } 

main.cpp

#include <iostream> 

#include "TestClass.h" 

using namespace std; 

int main() 
{ 
    cout << TestClass::foo() << endl; 

    return 0; 
} 

Здесь ошибка:

g++ main.cpp -o main.app 
/tmp/ccCjOhpy.o: In function `main': 
main.cpp:(.text+0x18e): undefined reference to `TestClass::foo()' 
collect2: ld returned 1 exit status 

ответ

10

Включите TestClass.cpp в командной строке, так что компоновщик может найти определение функции:

g++ main.cpp TestClass.cpp -o main.app 

В качестве альтернативы, компилировать каждый их собственный объектный файл, а затем сообщить компилятору, чтобы связать их вместе (это перешлем их линкера)

g++ -c main.cpp -o main.o 
g++ -c TestClass.cpp -o TestClass.o 
g++ main.o TestClass.o -o main.app 
+0

Как странно! Раньше я никогда не сталкивался с этой проблемой. Я новичок в C++, и я думаю, что у меня всегда была IDE, чтобы сделать это для меня. Неудивительно! Благодаря! – 2009-03-26 20:31:12

+1

@Scott - Вот почему вы должны потратить некоторое время в командной строке;). Он ясно показывает, что IDE скрывается от вас ... –

+0

Я должен не согласиться с переименованием файлов. Как бы то ни было, файлы называются после того, что они содержат, в соответствии с случаем содержимого (функция «main» и класс «TestCase»). – camh

0

Вы не компиляции и линковки TestClass.cpp (где реализация foo() есть). Поэтому компилятор жалуется, что вы пытаетесь использовать неопределенную функцию.