我正在尝试在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;
}
答案 0 :(得分:2)
您在GMCORD.c中包含C源文件GM_SubLibrary.c而不是头文件GMHeader.h。
答案 1 :(得分:1)
你不应该#include
个c文件,只有标题。您收到此错误是因为您的GMCORD.c
基本上已包含GM_SubLibrary.c
中的所有代码,因此如果您在同一项目中编译这两个文件,则会获得两次定义的代码
答案 2 :(得分:1)
#include
指令将包含文件中的所有文本放入当前文件中。如果将GM_SubLibrary.c
编译为独立模块(由于编译器注意到该名称的.o
文件),那么最终会编译两次相同的代码。
当链接器试图找出要调用的函数时,它无法区分两个定义。看到定义完全相同是不够聪明的,只是当你调用函数X,执行Y时,你似乎给出了两组指令。
您可能打算包含.h
文件。