问题重现
比如现在有两个文件:mytimer.h,main.cpp
mytimer.h
#include <time.h>
#include <windows.h>
int gettimeofday(struct timeval *tp, void *tzp){
time_t clock;
struct tm tm;
SYSTEMTIME wtm;
GetLocalTime(&wtm);
tm.tm_year = wtm.wYear - 1900;
tm.tm_mon = wtm.wMonth - 1;
tm.tm_mday = wtm.wDay;
tm.tm_hour = wtm.wHour;
tm.tm_min = wtm.wMinute;
tm.tm_sec = wtm.wSecond;
tm.tm_isdst = -1;
clock = mktime(&tm);
tp->tv_sec = clock;
tp->tv_usec = wtm.wMilliseconds * 1000;
return (0);
}
main.cpp
#include "mytimer.h"
int main(void){
return 0;
}
这样编译会报如标题的错误:
…fatal error LNK1169: 找到一个或多个多重定义的符号…
原因
出现这个情况的原因大部分是由于头文件包含引起。在编译工程的时候,mytimer.h编译生成gettimeofday
的符号,由于main.cpp中包含了mytimer.h,相当于又生成了一个gettimeofday
的符号,这样一来链接的时候则会出现符号重定义的错误;
解决
将mytimer.h拆分成两个文件:mytimer.h和,mytimer.cpp,内容分别如下:
mytimer.h(仅保留函数声明-不用看前两行)
#include <time.h>
#include <windows.h>
int gettimeofday(struct timeval *tp, void *tzp);
mytimer.cpp(实现函数)
#include "mytimer.h"
int gettimeofday(struct timeval *tp, void *tzp){
time_t clock;
struct tm tm;
SYSTEMTIME wtm;
GetLocalTime(&wtm);
tm.tm_year = wtm.wYear - 1900;
tm.tm_mon = wtm.wMonth - 1;
tm.tm_mday = wtm.wDay;
tm.tm_hour = wtm.wHour;
tm.tm_min = wtm.wMinute;
tm.tm_sec = wtm.wSecond;
tm.tm_isdst = -1;
clock = mktime(&tm);
tp->tv_sec = clock;
tp->tv_usec = wtm.wMilliseconds * 1000;
return (0);
}
main.cpp
#include "mytimer.h"
int main(void){
return 0;
}
这样编译链接就会顺利通过了,因为函数本体只被编译了一次。
如有错误欢迎留言指出