日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

fatal error LNK1169: 找到一个或多个多重定义的符号 的解决方案

發(fā)布時間:2023/12/10 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 &)" (??0DirectEllipseFit@@QAE@ABV?$Matrix@N$0?0$00$0A@$0?0$00@Eigen@@0@Z) 已經在 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,同樣編譯生成目標文件的時候,也會包含構造函數的實現。這樣二者在鏈接階段就會發(fā)現有兩個一模一樣的函數,出現了重定義的問題。

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

一、添加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中定義一個全局變量,也會出現這個問題,具體可參考:

《 C++雜記:“error LNK1169: 找到一個或多個多重定義的符號”的解決方法》

《HPP定義也會出現這個問題》:由于hpp本質上是作為.h被調用者include,所以當hpp文件中存在全局對象或者全局函數,而該hpp被多個調用者include時,將在鏈接時導致符號重定義錯誤。要避免這種情況,需要去除全局對象,將全局函數封裝為類的靜態(tài)方法。或者聲明與定義分開。


總結

以上是生活随笔為你收集整理的fatal error LNK1169: 找到一个或多个多重定义的符号 的解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。