【解決+理解】fatal error LNK1169: 找到一個或多個多重定義的符號

問題重現

比如現在有兩個文件: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;
}

這樣編譯鏈接就會順利通過了,因爲函數本體只被編譯了一次。

如有錯誤歡迎留言指出

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章