我有一个关于 C 编程语言的新手问题。我四处寻找类似问题的答案,但我没有弄明白。
假设一个简单的项目包含两个目录:src 和 test。源文件和头文件由 src/main.c、test/foo.h 和 test/foo.c 定义。
源代码/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 链接来自不同目录的可执行文件?
-------------------- 解决方案--------------------
edit3:大声笑毕竟解决方案非常简单,我所要做的就是创建一个“新源文件夹”而不是“新文件夹”。我觉得自己很愚蠢,但感谢大家的回复,尤其是 H2CO3!
最佳答案
I figured it wasn't a linking error since the macro gets recognized but the method is not callable.
不合逻辑。宏在预处理阶段被扩展。 (因此,它们与链接完全无关。)您确实遇到了链接器错误。
您需要做的是编译这两个文件,然后将它们链接在一起,所以这样的事情应该可行:
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++,这些几乎相同,只是通常名称不同。)
关于从另一个目录中的源文件调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19368973/