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

时间:2013-10-14 20:43:56

标签: c eclipse linker include function-call

我有一个关于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

test / foo.c(多余但要完整):

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

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

我在Eclipse中创建了项目,我也用它编译,我认为它不是链接错误,因为宏被识别但方法不可调用。

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

有什么想法在这里发生了什么?我错过了一些非常明显的东西吗?

非常感谢任何帮助,提前谢谢!

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

edit2:感谢H2CO3的回答,我知道它确实是一个链接错误。由于每次手动编译和链接都是一个很大的开销,我想知道是否有人知道如何教Eclipse来链接来自不同目录的可执行文件?

--------------------- SOLUTION ---------------------

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

1 个答案:

答案 0 :(得分:3)

  

我认为这不是链接错误,因为宏被识别但方法不可调用。

不合理。宏在预处理阶段得到扩展。 (因此,它们根本与链接无关。)您确实存在链接器错误。

你要做的就是编译这两个文件然后将它们链接在一起,所以这样的事情应该有效:

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 ++来说,它们几乎相同,它只是通常不同的名称。)