重复符号错误 - 全局变量

3

我有三个文件:

jarvismarch.c
jarvismarchtools.c
jarvismarchtools.h

运行make之后,我收到了以下错误:
Andrew-Carpenters-Laptop:Independent Study ahcarpenter$ make
cc    -c -o jarvismarch.o jarvismarch.c
cc    -c -o jarvismarchtools.o jarvismarchtools.c
cc -o jarvismarch jarvismarch.o jarvismarchtools.o
ld: duplicate symbol _string1 in jarvismarchtools.o and jarvismarch.o for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [all] Error 1

string 1是在jarvismarchtools.c中声明的。 jarvismarchtools.cjarvismarch.c都包含了jarvismarchtools.h

有任何解决此错误的想法吗?

jarvismarchtools.h中:

/*
    FILENAME: jarvismarchtools.h
    AUTHOR: Andrew H. Carpenter
    DATE: 2 Feb 2013
    DESCRIPTION: This is a header file containing tools for running Jarvis' March.
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

extern int string1 = 1;

typedef struct Point {
    double x, y;
    char *label;
} point;

/*
    DESCRIPTION: A function that determines the angle (in degrees) between two points.
    INPUT: Requires two points as input.

jarvismarchtools.c 文件中:

/*
    FILENAME: jarvismarchtools.c
    AUTHOR: Andrew H. Carpenter
    DATE: 2 Feb 2013
    DESCRIPTION: This is an implemenetation file containing tools for running Jarvis' March.
*/
#include "jarvismarchtools.h"

int string1 = 1;

float getAngle(point p1, point p2){
1个回答

7

如果变量应该被共享:

  • 在头文件中将其设为extern
  • 在某个C文件中定义它,不要使用extern

如果变量不应该被共享,在前面添加一个static


1
所以我已经按照上面描述的更改进行了修改,但是我仍然收到上述错误。有什么想法吗? - Drew
@Drew 请发布修改后的代码和精确的错误信息。 - Code-Apprentice
1
你可能还想添加一句话,即变量只能/应该在一个地方初始化。 - Code-Apprentice
+1 @Code-Guru - extern int string1 = 1 看起来可能是错误的。 - Carl Norum
1
@Drew 你应该在头文件中声明变量而不是初始化它。你应该在.c文件中定义并初始化变量。 - Code-Apprentice
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接