C 从另一个目录中的源文件调用方法

C 从另一个目录中的源文件调用方法,c,eclipse,linker,include,function-call,C,Eclipse,Linker,Include,Function Call,我有一个关于C编程语言的新手问题。我环顾四周,想在类似的问题中找到答案,但我没能找到答案 假设一个简单的项目由两个dir组成: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); /

我有一个关于C编程语言的新手问题。我环顾四周,想在类似的问题中找到答案,但我没能找到答案

假设一个简单的项目由两个dir组成: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" */
}
测试/食品卫生:

#ifndef FOO_H
#define FOO_H

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

#endif
测试/foo.c(冗余但完整):

#包括“foo.h”
#包括
void some_函数(int a){
printf(“%d”,+a);
}
我在Eclipse中创建了这个项目,并用它进行编译,我认为这不是一个链接错误,因为宏被识别了,但该方法是不可调用的

我之所以使用不同的目录,是因为我有很多文件,并且希望我的测试代码与我的主要源代码分开。请注意,src和test具有相同的父目录

你知道这是怎么回事吗?我是否遗漏了一些非常明显的东西

任何帮助都将不胜感激,提前感谢

编辑:我正在(Debian)Linux机器上工作,Eclipse使用gcc编译器

编辑2:多亏了H2CO3的回答,我才知道这确实是一个链接错误。由于每次手动编译和链接都是相当大的开销,我想知道是否有人知道如何教Eclipse链接来自不同目录的可执行文件

---------------------解决方案---------------------

edit3:Lol这个解决方案很简单,毕竟,我所要做的就是创建一个“新源文件夹”,而不是一个“新文件夹”。我觉得自己很愚蠢,但感谢你们的回复,尤其是H2CO3

我认为这不是一个链接错误,因为宏被识别了,但是该方法是不可调用的

非顺序逻辑。宏在预处理阶段展开。(因此,它们与链接没有任何关系。)确实存在链接器错误。

您需要做的是编译这两个文件,然后将它们链接在一起,这样应该可以:

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

此外,阅读和/或了解编译过程的各个步骤是如何协同工作的。(对于C++和C++,这几乎是相同的,只是名称的不同,通常是不同的)。NOOOOOOO@H2CO3-那不管用吗?不管用,不管实施情况如何,当包含头文件时,我的主文件应该识别函数签名。不过还是要谢谢你@那么,为什么要提出这个建议呢?(我看过那种可怕的代码。太可怕了。)谢谢你的回复,它似乎在工作。然而,每次运行测试时都要编译两个目录中的所有文件是非常昂贵的,我想接下来的问题是如何在Eclipse中设置这种链接行为。我不希望您回答这个问题,因为您可能使用命令行或脚本进行链接和编译。但是谢谢你的回复,它给了我一些链接过程中的新见解!顺便说一句,如果没有人能帮我在Eclipse中链接这些文件,我肯定会投票认为你的答案最有帮助@用户93692不客气。事实上,我使用
make
为自己做腿部工作。不幸的是,我无法帮助您设置Eclipse,因为我不使用它,但作为一般建议,1。请尝试将所有文件添加到项目中,2。在菜单中搜索类似“编译器设置”或“链接器设置”的内容,这些应该可以让您指定必要的标志。
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