0

通过以下设置,我不断收到链接器错误。

我有 file1.c 包含以下代码

#if defined( _TEST_ENABLED )

int get_value()
{
.
.
.    
}
#endif  /*_TEST_ENABLED   */

我有包含 file2.h 的 file2.c,它定义了 _TEST_ENABLED。file2.c 调用 get_value(),但是链接器没有任何部分。

我已经用尽了很多不同的选择,但成功率为零。现在我正在寻求帮助:)

4

3 回答 3

1

如果 file1.c 不包含 file2.h 或任何定义 的文件,则在预处理器在 file1.c 上运行时不会定义_TEST_ENABLED_TEST_ENABLED因此int get_value() { ... }不会被编译。

于 2013-09-18T15:20:43.333 回答
0

您的问题有一些含糊不清,但鉴于以下三个文件,我可以在 ANSI C 中编译和构建,但我必须在两个 .cs 中包含 .h:

文件1.c

#include "file2.h"

int main(void)
{
    someFunc();
    get_value();
    return 0;   
}

#ifdef _TEST_ENABLED
int get_value(void)
{
    return 0;   
}
#endif

文件2.c

#include "file2.h"

int someFunc(void);

int someFunc(void)
{
    get_value();
    return 0;
}

文件2.h

#define _TEST_ENABLED

int get_value(void); 
于 2013-09-18T15:39:08.780 回答
0

为了调用另一个文件中的函数:

1)文件必须被编译或至少链接在一起。最简单的方法是gcc file1.c file2.c,但是您也可以将两个文件编译为*.o文件,然后链接在一起。

2) 调用文件必须(通常通过包含的头文件)具有函数原型。这个原型必须在函数被使用之前出现。所以,如果file2.h定义了_TEST_ENABLED,那么你必须(在file2.c)包括file2.h,然后要么file2.cfile2.h必须包括file1.h,它必须包含一个函数原型(int get_value;

例如:

文件1.c

#include <file1.h>
#include <file2.h>

int main() {
  get_value();
}

文件1.h

#ifndef _FILE2_H
#define _FILE2_H

#define _TEST_ENABLED

#endif

文件2.c

#include <file2.h>
#include <file1.h>

#ifdef _TEST_ENABLED
int get_value() {
  return 42;
}
#endif

文件2.h

#ifndef _FILE2_H
#define _FILE2_H

int get_value();

#endif

请注意,对于预处理器而言,file1.c它们file2.c是完全分开处理的。处理时file2.c,它必须找到#define _TEST_ENABLED某个地方,这就是为什么file2.c必须包含file1.h. 由于这有点循环,您应该#include在每个头文件中添加 " -guards,如上所示。

于 2013-09-18T15:21:08.357 回答