具有外部get函数的未解析外部符号

时间:2013-09-18 15:16:14

标签: c

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

我有file1.c,其中包含以下代码

#if defined( _TEST_ENABLED )

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

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

我已经用尽了很多不同的选择而没有成功。现在我正在寻求帮助:)

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

2)调用文件通常必须通过包含的头文件具有该函数的原型。该原型必须在使用该函数之前出现。因此,如果file2.h定义_TEST_ENABLED,则您必须(在file2.c中)包含file2.h,然后file2.cfile2.h必须包含file1.h {1}},必须包含函数原型(int get_value;

例如:

file1.c中

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

int main() {
  get_value();
}

file1.h

#ifndef _FILE2_H
#define _FILE2_H

#define _TEST_ENABLED

#endif

file2.c中

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

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

file2.h

#ifndef _FILE2_H
#define _FILE2_H

int get_value();

#endif

请注意,出于预处理器的目的,file1.cfile2.c将完全分开处理。在处理file2.c时,它必须在某处找到#define _TEST_ENABLED,这就是file2.c必须包含file1.h的原因。由于这有点循环,您应该为每个头文件添加“#include - 警卫,如上所示。

答案 2 :(得分:0)

你的问题有一些含糊之处,但考虑到以下三个文件,我可以编译和构建ANSI C,但我必须在.cs中包含.h:

file1.c

#include "file2.h"

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

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

file2.c

#include "file2.h"

int someFunc(void);

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

file2.h

#define _TEST_ENABLED

int get_value(void);