2013-10-14 2 views
1

У меня есть вопрос новичков о языке программирования C. Я оглянулся, чтобы найти ответ в похожих вопросах, но я не смог понять это.Вызов метода из исходного файла в другом каталоге

Предположите простой проект, состоящий из двух разделов: src и test. Исходные и заголовочные файлы определяются src/main.c, test/foo.h и test/foo.c.

SRC/main.c:

#include "../test/foo.h" 

int main (void) { 
    int a = VAR; /* works, recognizes declared macro */ 
    some_function(a); /* doesn't work, "undefined reference" */ 
} 

тест/foo.h:

#ifndef FOO_H 
#define FOO_H 

void some_function(int a);  
#define VAR 2; 

#endif 

тест/foo.c (резервный, но быть полным):

#include "foo.h" 
#include <stdlib.h> 

void some_function(int a) { 
    printf("%d", ++a); 
} 

Я создал проект в Eclipse, и я также скомпилировал его, я понял, что это не ошибка связи, поскольку макрос распознается, но метод не может быть вызван ,

Причина, по которой я использую разные каталоги, состоит в том, что у меня много файлов, и мой тестовый код будет отделен от моего основного исходного кода. Обратите внимание, что src и test имеют один и тот же родительский каталог.

Любые идеи, что здесь происходит? Я пропустил что-то очень очевидное?

Любая помощь будет высоко оценена, спасибо заранее!

Редактировать: Я работаю над машиной Linux (Debian) и Eclipse использует компилятор gcc.

edit2: Благодаря ответу H2CO3 я узнал, что это действительно ошибка связи. Поскольку компиляция и привязка вручную каждый раз довольно накладные расходы, мне было интересно, если кто-нибудь знает, как научить Eclipse связывать исполняемые файлы из разных каталогов?

--------------------- РЕШЕНИЕ ---------------------

edit3: Lol решение было очень легким, все, что мне нужно было сделать, это создать «новую исходную папку», а не «новую папку». Я чувствую себя глупо, но благодаря всем вам за ответ, H2CO3 в частности!

+0

Попробуйте включить фактический исходный файл из 'main.c' =>' #include "../test/foo.c " – Cyclonecode

+1

@KristerAndersson *** NO NO NO NO NO NOOOOOOO *** –

+0

@ H2CO3 - Не так ли? – Cyclonecode

ответ

2

Я понял, что это не ошибка связи, так как макрос распознается, но метод не может быть вызван.

Non sequitur. Макросы расширены на этапе предварительной обработки. (И как таковые, они не имеют никакого отношения к привязке вообще.) У вас есть ошибка компоновщика.

То, что вы должны сделать, это собрать как файлы, а затем соединить их вместе, так что-то, как это должно работать:

gcc -Wall -o dir_one/foo.o dir_one/foo.c 
gcc -Wall -o dir_two/bar.o dir_two/bar.c 
gcc -o my_program dir_one/foo.o dir_two/bar.o 

Кроме того, читайте this SO question/answer и/или this article, чтобы понять, как этапы процесса компиляции работать вместе. (Это почти то же самое для C и C++, это только изменение имени, которое обычно отличается.)

+0

Спасибо за ответ, кажется, работает. Однако при компиляции всех файлов в обоих каталогах каждый раз, когда я запускаю тест, довольно дорого, я думаю, что мой следующий вопрос заключается в том, как установить это поведение связывания в Eclipse. Я не ожидаю, что вы ответите на этот конкретный вопрос, так как вы, вероятно, используете свою командную строку или скрипт для вашей компоновки и компиляции. Но спасибо за ответ, он дал мне некоторые новые идеи в процессе связывания! – ShellFish

+0

BTW Я, безусловно, буду голосовать за ваш ответ как полезный, если никто не сможет мне помочь связать эти файлы в Eclipse! – ShellFish

+0

Спасибо, человек, вы спасли меня пару часов разочарования! – ShellFish

Смежные вопросы