在构建C程序时,如何解决CodeBlock中的“多个定义”错误?

时间:2014-02-09 22:21:44

标签: c codeblocks

我正在尝试在CodeBlocks中构建这个项目,以便我可以逐步完成其中一个功能,但是我在构建它时遇到了麻烦。这是我的错误

||=== Build: Debug in MAGLAT (compiler: GNU GCC Compiler) ===|
obj\Debug\GMCORD.o||In function `GM_CartesianToSpherical':|
C:\Users\Guest\SkyDrive\temp\MAGLAT\MAGLAT\GM_SubLibrary.c|11|multiple definition of `GM_CartesianToSpherical'|
obj\Debug\GM_SubLibrary.o:C:\Users\Guest\SkyDrive\temp\MAGLAT\MAGLAT\GM_SubLibrary.c|11|first defined here|

// HEADER FILE

#ifndef GMHEADER_H
#define GMHEADER_H
#endif

#ifndef M_PI
#define M_PI    ((2)*(acos(0.0)))
#endif

#define GM_STARTYEAR    1900
#define RAD2DEG(rad)    ((rad)*(180.0L/M_PI))
#define DEG2RAD(deg)    ((deg)*(M_PI/180.0L))
#define ATanH(x)    (0.5 * log((1 + x) / (1 - x)))
#define MU_0        4*M_PI / 10000000
#define R_e     6.371 * 1000000

#define TRUE        ((int)1)
#define FALSE       ((int)0)


typedef struct {
            int Day;
            int Month;
            int Year;
            double DecimalYear;
            int DayNumber;
            } GMtype_Date;

typedef struct {
            double lambda;// longitude
            double phi; // geodetic latitude
            double HeightAboveEllipsoid; // height above the ellipsoid (HaE)
            } GMtype_CoordGeodetic;

typedef struct {
...
...
}...;

//GM Cord functions
void GM_CartesianToSpherical(GMtype_CoordCartesian CoordCartesian, GMtype_CoordSpherical *CoordSpherical);

/// GM_SubLibrary.c

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

#include "GMHeader.h"



void GM_CartesianToSpherical(GMtype_CoordCartesian CoordCartesian, GMtype_CoordSpherical *CoordSpherical)
{
    /*This function converts a point from Cartesian coordinates into spherical coordinates*/
    double X, Y, Z;

    X = CoordCartesian.x;
    Y = CoordCartesian.y;
    Z = CoordCartesian.z;

    CoordSpherical->r = sqrt(X * X + Y * Y + Z * Z);
    CoordSpherical->phig = RAD2DEG(asin(Z / (CoordSpherical->r)));
    CoordSpherical->lambda = RAD2DEG(atan2(Y, X));
} /*GM_CartesianToSpherical*/

/// GMCORD.c

//----------------------------------------------------------------------------------------

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

#include "GM_SubLibrary.c"


//----------------------------------------------------------------------------------------


int main()
{
    int Flag = 1;
    char ans[20];
    GMtype_Date date;
    GMtype_Data G0, G1, H1;
    GMtype_CoordGeodetic location;
    GMtype_CoordDipole GMlocation;
    GMtype_Ellipsoid Ellip;


    GM_ScanIGRF(&G0, &G1, &H1);
    GM_SetEllipsoid(&Ellip);
    while(Flag == 1) {
        GM_GetUserInput(&location, &date);
        GM_CORD(location, &date, Ellip, G0, G1, H1, &GMlocation);
        GM_PrintUserData(location, date, GMlocation);
    ...
    }
    return 1;
}

3 个答案:

答案 0 :(得分:2)

您在GMCORD.c中包含C源文件GM_SubLibrary.c而不是头文件GMHeader.h。

请参阅:Including one C source file in another?

答案 1 :(得分:1)

你不应该#include个c文件,只有标题。您收到此错误是因为您的GMCORD.c基本上已包含GM_SubLibrary.c中的所有代码,因此如果您在同一项目中编译这两个文件,则会获得两次定义的代码

答案 2 :(得分:1)

#include指令将包含文件中的所有文本放入当前文件中。如果将GM_SubLibrary.c编译为独立模块(由于编译器注意到该名称的.o文件),那么最终会编译两次相同的代码。

当链接器试图找出要调用的函数时,它无法区分两个定义。看到定义完全相同是不够聪明的,只是当你调用函数X,执行Y时,你似乎给出了两组指令。

您可能打算包含.h文件。