2011-06-30 9 views
7

Ostatnio próbowałem skompilować program w g ++ (na Ubuntu). Zwykle używam Dev-C++ (w Windows) i działa tam dobrze, dopóki robię projekt i umieszczam tam wszystkie niezbędne pliki.Łączenie plików w g ++

Błąd występujący podczas kompilacji programu jest:

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

Pliki wykorzystywane są następujące:

Kod źródłowy (.cpp) plik z funkcją główną.

Plik nagłówkowy z prototypami funkcji.

Plik .cpp z definicjami dla każdej funkcji.

Każda pomoc zostanie doceniona.

+0

jeśli mógłbyś opublikować swój kod ..... to będzie pomoc ... –

+0

Dev-C++ to IDE. Domyślnie używa portu MinGW GCC. –

Odpowiedz

17

Prawdopodobnie próbowałeś skompilować i połączyć zamiast kompilować pliki źródłowe lub jakoś zapomniałeś.

Variation jeden (wszystko w jednej linii; recompiles wszystko cały czas):

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

Variation dwa (krok po kroku, jeśli nie -o jest, gcc będzie ponownie użyć nazwy pliku wejściowego i po prostu zmienić rozszerzenie gdy nie łącząc; zmiana ta najlepiej nadaje się do makefile; pozwala na pominięcie części niezmieniony):

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

odmianami trzy (niektóre zastępcze):

Nie poda tego, ale wspomniane wyżej parametry mogą również pełnić rolę symboli zastępczych, np. g++ -c *.cpp skompiluje wszystkie pliki cpp w bieżącym katalogu do plików o (bject) o tej samej nazwie.

Ogólnie nie powinieneś się o to martwić, chyba że naprawdę musisz pracować bez IDE. Jeśli nie jesteś biegły w składni wiersza poleceń, najpierw trzymaj się IDE.

2

Linia poleceń gcc powinna wyglądać następująco:

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

Sprawdź, w którym plik cpp brakującym funkcja członek klasa jest zdefiniowana. Być może nie podałeś go gcc.

0

Możesz również sprawdzić poprawność tagów #include w ciągu filename.cpp. Załóżmy, że filename.cpp używa kodu zawartego w myclass.h obecnego w tym samym katalogu co filename.cpp. Załóżmy, że klasa, która g ++ mówi jest niezdefiniowana, jest zawarta w myclass.h i zdefiniowana w myclass.cpp.Tak więc, aby prawidłowo zawierać myclass.h w filename.cpp, wykonaj następujące czynności:

  1. W filename.cpp:

#include <iostream>
#include <myclass.h>
..source code.

  1. W makefile:

    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

W powyższym należy zwrócić uwagę na stosowanie -I. opcji podczas kompilowania filename.cpp. Numer -I<directory> prosi o podanie g++ w celu włączenia ścieżki podążającej za częścią -I do ścieżki wyszukiwania. W ten sposób myclass.h jest poprawnie dołączony.

W przypadku braku większej ilości informacji (może źródło), trudno jest powiedzieć z dokładnością, gdzie leży problem. Wszystkie próby będą tylko strzały w ciemności.

0

Zakładam, że masz ogłoszony funkcji składowej (zwykle w pliku .h lub .hpp) ale, pominięte odpowiednią definicję funkcji składowej (zwykle w pliku .cpp).

w C++, możliwe jest, aby zadeklarować klasę tak:

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

z pliku cpp, że idzie tak więc

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

Uwaga, nie ma foo::y().

Nie stanowi to problemu dla procesu kompilowania/łączenia, o ile funkcja składowa foo::y() nie jest przywoływana w całym skompilowanym kodzie.

Powiązane problemy