1. 程式人生 > >fatal error LNK1169: 找到一個或多個多重定義的符號 的解決方案

fatal error LNK1169: 找到一個或多個多重定義的符號 的解決方案

昨天,嘗試一個專案,遇到了如下的問題。先來還原一下:

標頭檔案test.h

#pragma once
#include <Eigen/Core>
#include <iostream>

using namespace Eigen;
using namespace std;

class point2
{
public:
point2(int x1,int y1):x(x1),y(y1){}
point2& operator+(point2 s);

private:
int x,y;
};


class DirectEllipseFit
{
public:

   DirectEllipseFit(const Eigen::VectorXd &xData, const Eigen::VectorXd &yData);
private:
Eigen::VectorXd m_xData;
Eigen::VectorXd m_yData;

};

DirectEllipseFit::DirectEllipseFit( const Eigen::VectorXd &xData, const Eigen::VectorXd &yData)
{
m_xData = xData;
m_yData = yData;
}

test.cpp
#include"test.h"


point2& point2::operator+(point2 s)
{
	this->x=x+s.x;
	this->y+=s.y;
	return *this;
}

main.cpp
#include "test.h"

int main(void)
{
    return 0;
}
結果程式連結階段,出現如下錯誤:
1>test.obj : error LNK2005: "public: __thiscall DirectEllipseFit::DirectEllipseFit(class Eigen::Matrix<double,-1,1,0,-1,1> const &,class Eigen::Matrix<double,-1,1,0,-1,1> const &)" (
[email protected]
@[email protected][email protected][email protected][email protected]@@[email protected]) 已經在 main.obj 中定義 1>E:\c++\testEigen\Debug\testEigen.exe : fatal error LNK1169: 找到一個或多個多重定義的符號

開始百思不得其解,後來想到了定義類時,一般宣告和實現分離,於是我將DirectEllipseFit的建構函式移到了test.cpp中,果然問題解決了。後來檢視資料,終於找到了原因。
實際上,test.cpp由於包含了test.h,而test.h中包含了建構函式的實現,於是test.cpp生成目標檔案的時候,包含了建構函式的實現。而main.cpp也包含了test.h,同樣編譯生成目標檔案的時候,也會包含建構函式的實現。這樣二者在連結階段就會發現有兩個一模一樣的函式,出現了重定義的問題。

解決這個問題的方法,有兩種:

一、新增inline關鍵字,這樣實際上是在呼叫處展開函式體程式碼,代替函式呼叫。
即:

class DirectEllipseFit
{
public:

inline	DirectEllipseFit(const Eigen::VectorXd &xData,  const Eigen::VectorXd &yData);
private:
	Eigen::VectorXd m_xData;
	Eigen::VectorXd m_yData;
	
};

DirectEllipseFit::DirectEllipseFit( const Eigen::VectorXd &xData,  const Eigen::VectorXd &yData)
{
	m_xData = xData;
	m_yData = yData;
}


二、將函式實現放在test.cpp中,這樣就不會出現重定義問題。

PS:

其實還有一種情況也會出現以上問題,即如果我們在test.h中定義一個全域性變數,也會出現這個問題,具體可參考:

HPP定義也會出現這個問題》:由於hpp本質上是作為.h被呼叫者include,所以當hpp檔案中存在全域性物件或者全域性函式,而該hpp被多個呼叫者include時,將在連結時導致符號重定義錯誤。要避免這種情況,需要去除全域性物件,將全域性函式封裝為類的靜態方法。或者宣告與定義分開。


相關推薦

fatal error LNK1169: 找到一個多重定義符號

編譯 gpo .cpp post 多重 print use 控制 包含 在vs中,使用c時,由編譯-鏈接,cpp之間是自動的,如: 1,頭文件 x.h: 1 int f(); 2,實現 impl.cpp: 1 #include "stdafx.h" 2 3 int

fatal error LNK1169: 找到一個多重定義符號.c/.cpp檔案想同時呼叫定義在.h檔案裡面的全域性變數,防止重定義變數問題。

為什麼.h檔案中不能定義全域性變數? 原因: 存在多次建立變數.如果標頭檔案中可以定義全域性變數,那麼每個包含該標頭檔案的檔案裡都會有該全域性變數的定義.因為C語言的include是直接將檔案嵌入到include這個地方的. 解決辦法: ​在標頭檔案使用 extern 來宣告該全域性變

C++:fatal error LNK1169: 找到一個多重定義符號

錯誤:fatal error LNK1169: 找到一個或多個多重定義的符號 原因:我們都知道一般高階語言程式編譯的過程其中有編譯、連結兩步這兩步: 1.編譯是原始碼生成obj二進位制目標檔案的過程, 注意一個原始碼檔案(指.cpp, 而非.h, .h已經被

fatal error LNK1169: 找到一個多重定義符號解決方案

昨天,嘗試一個專案,遇到了如下的問題。先來還原一下: 標頭檔案test.h #pragma once #include <Eigen/Core> #include <iostream> using namespace Eigen; using n

fatal error LNK1169: 找到一個多重定義符號解決方法

fatal error LNK1169: 找到一個或多個多重定義的符號;這個問題出現的情況。 字面意思理解,有一個符號被多次定義,比如變數名,方法名。在C語言中,不像在java語言中,在不同的檔案中,也不能使用相同的方法名。這個貌似涉及到了c語言的編譯連結過程。 舉個例子:

error LNK1169: 找到一個多重定義符號”的解決方法(轉載)

問題描述如下: 有 三個原始檔,A.h、B.cpp、C.cpp。 A.h是標頭檔案,其中聲明瞭三個變數a1、a2、 a3。 B.cpp是A.h中所宣告的類的實現原始碼,C.cpp是主程式檔案。B.cpp和C.cpp中均包含標頭檔案 A.h。 在編譯時,編譯能夠通過,

第六十五篇:VS工程檔案中cpp、h檔案在main中呼叫關係及如何避免出現“找到一個多重定義符號

作者:liaojiacai    郵箱: [email protected] 1、出現的問題:”error   LNK1169:   找到一個或多個多重定義的符號“的錯誤 2、該問題出現的場景:(假設有一個A.h,A.cpp,main,在main中呼叫了A.cpp

fatal error LNK1169:找到一個定義符號

ava 文件中 程序 bsp 由於 nbsp .cn 引用 error 這個算是個比較基礎的問題,由於我不是C程序員,本行java,臨時拉來做的,所以有些坑還得自己走出來。 這個問題是由於,全局變量在a.h中定義,在兩個源文件a.cpp和b.cpp中引用,之後被編譯器

office2007 開啟Excel 提示 工作表中的公式包含一個無效引用的解決方法

開啟帶有資料或者圖表的工作表或工作簿中,有時候會彈出一個對話方塊“工作表中的公式包含一個或多個無效引用,請驗證公式包含的路徑、工作簿、區域名稱或單元格引用”,單擊確定後就不再顯示,但只要重新開啟,依舊會彈出這個對話方塊。 解決方法: 其實有時並不是這個Excel本身公式有

錯誤:“LNK1169找到一個或者定義符號

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">今天自己寫了一個頭檔案,然後依照書上推薦的“宣告和實現分離”方法,把類

列表的使用(append,count,extend,index,pop,remove)dir;出列表中指定一個元素並刪除

斜體樣式列表:在一個數組裡存或者取多個資訊 列表操作功能有:索引 切片 追加 刪除 長度 迴圈 包含 列表舉例:name_list=[“R”,“u”,“b”,“y”] print(name_list[1]) >>>u pr

Visual Studio 不到一個元件,請重新安裝該應用程式

開啟 Visual Studio 的時候,彈出如下的對話方塊: 出現上述問題的原因是少了某些元件,原因可能是安裝目目錄下的檔案被誤刪或是被防毒軟體隔離了,如果是誤刪的話,重新找到該檔案將其恢復至原來位置即可。如果是被防毒軟體隔離了,就需要找到病毒查殺模組下的“恢復區”找到被隔離檔案並恢復即可。

VS 03 05 08 不到一個元件的解決方法

PS 這個原因出現是因為vs安裝錯誤造成的 話說我是因為之前安裝了office03精簡版 後來解除安裝掉重新裝的office03完整版 結果vs就報 找不到一個或多個元件的解決方法 錯 執行不了了 後來經多方查證 只有03和08的解決辦法 於是我摸索的查出了05的登錄檔項 現在公佈給大家 方便大家使用 1、

VS2013 C#呼叫EXCEL 編譯報錯:不到編譯動態表示式所需的一個型別。是否缺少引用?

背景:客戶提出需求希望把獲取的結果匯出成excel表格,本人曾經自制過一個excel操作類(不甚完整但是夠用),找到原有專案將操作類匯入至新專案後,編譯開始報錯:“找不到編譯動態表示式所需的一種或多種型別。是否缺少引用?”如下圖所示按照網路上的方法將Microsoft.Off

一個實體的驗證失敗。有關詳細信息,請參閱“EntityValidationErrors”屬性。

sys date 錯誤 onerror conf erro fig 站點 更新 問題原因可能是: 1. 非空列未插入值錯誤 2. 多個表間外鍵列長度不一樣 3. ef上下文對象db為空 4. ef上下文設置屬性為 db.Configurat

js 獲取url的參數值 一個參數

run -c www cno spl http 獲取url參數 strong ear 以下JS函數用於獲取url參數: 1 function getQueryVariable(variable) 2 { 3 var query = window.loc

Object.assign() 從一個源對象復制到目標對象

bject 待完善 示例 ces sign java script {} clas Object.assign()方法用於將所有可枚舉屬性的值從一個或多個源對象復制到目標對象。它將返回目標對象。 1、語法: Object.assign(target, ... , sourc

js將數組中一個字段相同的子元素中合並

++ body 遇到 return json 合並 arr 可能 var 最近js中遇到js將數組中一個或多個字段相同的子元素中合並,相信很多朋友也有遇到,大家可能有多種方法,我在這裏記錄一個相對簡單的方法,當然大家如有其它更好的方法,請提出來大家共同學習。 //將經濟事

js 一個一維數組,算出元素之間相互組合的所有情況

urn each pre 相互 get function post data nta // 數據源 var target = { state1: [‘1‘, ‘2‘], state2: [‘01‘, ‘02‘, ‘03‘],

Windows無法安裝到這個磁盤下,分區包含一個不支持安裝的動態卷

windows安裝 動態磁盤 解決方案:1.系統安裝盤 2.WinPE 基本操作如下: shift+F10 # 進入命令行環境diskpart # 進入diskpart命令環境list diskpart #顯示基本磁盤信息select disk n(磁盤號)