Связывание файлов в g ++ - PullRequest
11 голосов
/ 30 июня 2011

Недавно я попытался скомпилировать программу в g ++ (в Ubuntu).Обычно я использую Dev-C ++ (в Windows), и он отлично работает там, пока я создаю проект и помещаю туда все необходимые файлы.

Ошибка, возникающая при компиляции программы:

$filename.cpp: undefined reference to '[Class]::[Class Member Function]'

Используются следующие файлы:

Файл исходного кода (.cpp) сосновная функция.

Файл заголовка с прототипами функций.

Файл .cpp с определениями для каждой функции.

Любая помощь приветствуется.

Ответы [ 4 ]

24 голосов
/ 30 июня 2011

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

Вариант один (все в одной строке; все время перекомпилируется):

g++ -o myexecutable first.cpp second.cpp third.cpp [other dependencies, e.g. -Lboost, -LGL, -LSDL, etc.]

Вариант два (шаг за шагом; если не указано -o, gcc будет повторно использовать имя входного файла и просто изменит расширение, когда не будет ссылки; этот вариант лучше всего использовать для make-файлов; позволяет пропустить неизмененные части):

g++ -c first.cpp
g++ -c second.cpp
g++ -c third.cpp
g++ -o myexecutable first.o second.o third.o [other dependencies]

Вариант три (некоторые заполнители):

Не буду перечислять его, но параметры, упомянутые выше, также могут быть заполнителями, например g++ -c *.cpp скомпилирует все файлы cpp в текущей директории в o (bject) файлы с одинаковыми именами.

В целом, вы не должны слишком беспокоиться об этом, если вам действительно не нужно работать без какой-либо IDE. Если вы не очень разбираетесь в синтаксисе командной строки, вначале придерживайтесь IDE.

2 голосов
/ 30 июня 2011

Командная строка gcc должна выглядеть следующим образом:

g++ -o myprogram class1.cpp class2.cpp class3.cpp main.cpp

Проверить, в каком файле cpp определена отсутствующая функция члена класса.Возможно, вы не передали его gcc.

0 голосов
/ 30 июня 2011

Я предполагаю, что вы объявили функцию-член (обычно в файле .h или .hpp), но не указали соответствующее определение функции-члена (обычно в файле .cpp).

В c ++ можно объявить класс следующим образом:

class foo {
  void x();
  void y();
}

с файлом cpp, который выглядит так

void foo::x() {
   do_something()
}

Обратите внимание, что foo::y().

Это не создает проблем для процесса компиляции / компоновки, если функция-член foo::y() нигде не упоминается в скомпилированном коде.

0 голосов
/ 30 июня 2011

Вы также можете проверить правильность тегов #include в пределах filename.cpp.Предположим, что filename.cpp использует код, содержащийся в myclass.h, который находится в том же каталоге, что и filename.cpp.Предположим, что класс, который g ++ говорит как неопределенный, содержится в myclass.h и определен в myclass.cpp.Итак, чтобы правильно включить myclass.h в filename.cpp, сделайте следующее:

  1. In filename.cpp:
#include <iostream>  
#include <myclass.h>  
//..source code.  
В make-файле:
filename.o: myclass.C myclass.h filename.cpp
g++ -I./ -c filename.cpp -o filename.o

myclass.o: myclass.C myclass.h  
g++ -c myclass.C -o myclass.o

В приведенном выше примере обратите внимание на использование опции -I. при компиляции filename.cpp.-I<directory> просит g++ включить путь, следующий за частью -I, в путь поиска.Таким образом, myclass.h правильно включен.

В отсутствие дополнительной информации (возможно, источника) трудно с какой-либо точностью сказать, в чем заключается проблема.Все попытки будут, но нанесут удар в темноте.

...