我通过以下设置不断收到链接器错误。
我有file1.c,其中包含以下代码
#if defined( _TEST_ENABLED )
int get_value()
{
.
.
.
}
#endif /*_TEST_ENABLED */
我有file2.c,其中包含file2.h,它定义了_TEST_ENABLED。 file2.c调用get_value(),但是链接器没有任何部分。
我已经用尽了很多不同的选择而没有成功。现在我正在寻求帮助:)
答案 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.c
或file2.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.c
和file2.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);