問題重現
比如現在有兩個文件: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;
}
這樣編譯鏈接就會順利通過了,因爲函數本體只被編譯了一次。
如有錯誤歡迎留言指出