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

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!

4

1 回答 1

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

此外,请阅读此 SO 问题/答案和/或本文以了解编译过程的步骤如何协同工作。(对于 C 和 C++,这些几乎相同,只是名称修饰通常不同。)

于 2013-10-14T20:54:14.027 回答