2011-08-16 15 views
5
/me/home/file1.c containes function definition: 

int mine(int i) 
{ 
    /* some stupidity by me */ 
} 

Mam ogłosił tę funkcję wużywając funkcji w różnych plikach .c (c programowanie 101)

/me/home/file1.h 

int mine(int); 

jeśli chcę korzystać z tej funkcji mine() w /me/home/at/file2.c

Aby to zrobić , wszystko co muszę zrobić to:

file2.c 

#include "../file1.h" 

Czy to wystarczy? Prawdopodobnie nie.

Po robi to znacznie, kiedy mogę skompilować file2.c, mam undefined reference to 'mine'

Odpowiedz

6

Potrzebny będzie również połączyć obiekt z pliku plik1. Przykład:

gcc -c file2.c 
gcc -c ../file1.c 
gcc -o program file2.o file1.o 

Albo możesz także wysyłać wszystkie pliki jednocześnie i pozwolić GCC wykonać pracę (nie sugerowaną poza garstką plików);

gcc -o program file1.c file2.c 
+0

Dzięki Yann. Jak mogę to zrobić w pliku Makefile? – hari

+1

Generalnie można odejść od określania tylko plików obiektowych, a GCC jest wystarczająco inteligentny, aby zrobić resztę. Np .: program: file1.o file2.o \ n \ tgcc -o program file1.o file2.o' –

+0

Wielkie dzięki za szybką pomoc. – hari

1

Nie używaj ../ w nagłówku. Zamiast pouczać gcc do korzystania z katalogu nadrzędnego jako zawierać ścieżkę:

(w co katalogu):

gcc -I../ -c file2.c 
+0

Czasami istnieją dobre powody, dla których nie robię -I ../, nie posunąłbym się tak daleko, aby powiedzieć "nie używaj ../" to dobra ogólna zasada. – George

1

Po robi to znacznie, kiedy mogę skompilować file2.c, mam odniesienie do niezdefiniowanej "mój"

Nie, nie. To nie kompilacja powoduje te błędy. To ta druga rzecz, nazywana "łączeniem".

Kompilator kompiluje jedną "jednostkę tłumaczeniową" - wynik uruchomienia preprocesora na jednym pliku źródłowym, prawdopodobnie ciągnąc więcej rzeczy za pośrednictwem #include - naraz, a następnie linker trzyma je razem, aby wykonać plik wykonywalny. Zazwyczaj ten sam program służy zarówno jako kompilator, jak i linker, z różnymi flagami, i zazwyczaj można powiedzieć, że robi wszystko na raz (i nie zapisuje żadnych plików tymczasowych dla skompilowanych jednostek tłumaczeniowych). Ale musisz powiedzieć, co należy połączyć, i musisz skompilować wszystko, co będzie połączone.

+0

Dzięki za szczegółową odpowiedź. – hari

Powiązane problemy