通过以下设置,我不断收到链接器错误。
我有 file1.c 包含以下代码
#if defined( _TEST_ENABLED )
int get_value()
{
.
.
.
}
#endif /*_TEST_ENABLED */
我有包含 file2.h 的 file2.c,它定义了 _TEST_ENABLED。file2.c 调用 get_value(),但是链接器没有任何部分。
我已经用尽了很多不同的选择,但成功率为零。现在我正在寻求帮助:)
通过以下设置,我不断收到链接器错误。
我有 file1.c 包含以下代码
#if defined( _TEST_ENABLED )
int get_value()
{
.
.
.
}
#endif /*_TEST_ENABLED */
我有包含 file2.h 的 file2.c,它定义了 _TEST_ENABLED。file2.c 调用 get_value(),但是链接器没有任何部分。
我已经用尽了很多不同的选择,但成功率为零。现在我正在寻求帮助:)
如果 file1.c 不包含 file2.h 或任何定义 的文件,则在预处理器在 file1.c 上运行时不会定义_TEST_ENABLED
,_TEST_ENABLED
因此int get_value() { ... }
不会被编译。
您的问题有一些含糊不清,但鉴于以下三个文件,我可以在 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);
为了调用另一个文件中的函数:
1)文件必须被编译或至少链接在一起。最简单的方法是gcc file1.c file2.c
,但是您也可以将两个文件编译为*.o
文件,然后链接在一起。
2) 调用文件必须(通常通过包含的头文件)具有函数原型。这个原型必须在函数被使用之前出现。所以,如果file2.h
定义了_TEST_ENABLED
,那么你必须(在file2.c
)包括file2.h
,然后要么file2.c
或file2.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,如上所示。