main.c中:
#include <stdio.h>
#include "proto.h"
int main(void)
{
return(0);
} // end main
support.c:
#include "proto.h"
\\ only function defintions
proto.h:
#ifndef proto
#define proto
double PI = 3.14159;
int LOOP_LIMIT = 90;
#endif
生成文件:
main: main.o support.o
gcc -lm -o main main.o support.o
main.o: main.c proto.h
gcc -c main.c
support.o: support.c proto.h
gcc -c support.c
每当我使用上面定义的文件运行makefile时,我总是会遇到多重定义错误,尽管有条件编译。
我不确定这里发生了什么以及如何解决问题。
错误信息是:
multiple definition of `PI'
multiple definition of `LOOP_LIMIT'
答案 0 :(得分:2)
您无法在从多个编译单元中包含的标头中定义变量。 PI
和LOOP_LIMIT
中的main.o
和support.o
都会在extern
和#ifndef proto
#define proto
extern double PI;
extern int LOOP_LIMIT;
#endif
中结束,因此您会收到链接器错误。正确的方法是在标题中声明#include "proto.h"
double PI = 3.14159;
int LOOP_LIMIT = 90;
\\ only function defintions
:
<强> proto.h 强>
const
然后在一个且只有一个.c文件中定义它们:
<强> support.c 强>
#define PI 3.14159
#define LOOP_LIMIT 90
顺便说一下,看起来这些人可能是常量而不是变量,所以要么将它们声明并定义为{{1}},要么将它们写为预处理器定义:
{{1}}
有了这些,你也避免了链接问题。