昨天,尝试一个项目,遇到了如下的问题。先来还原一下:

头文件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,同样编译生成目标文件的时候,也会包含构造函数的实现。这样二者在链接阶段就会发现有两个一模一样的函数,出现了重定义的问题。

解决这个问题的方法,有两种:

一、添加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时,将在链接时导致符号重定义错误。要避免这种情况,需要去除全局对象,将全局函数封装为类的静态方法。或者声明与定义分开。

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

  1. fatal error LNK1169: 找到一个或多个多重定义的符号

    fatal error LNK1169: 找到一个或多个多重定义的符号 "fatal error LNK1169: 找到一个或多个多重定义的符号"解决方法_u014552288的专 ...

  2. 【编译器问题】“fatal error LNK1169: 找到一个或多个多重定义的符号“ 解决方案

    文档声明: 以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正.并且该文档在后期会随着学习的深入不断补充完善.感谢各位的参考查看. 笔记资料仅供学习交流使用,转载请标明出处 ...

  3. C++报错:fatal error LNK1169: 找到一个或多个多重定义的符号

    一.概述   使用visual studio编写C++代码时,为了书写规范与标准,往往需要创建多个源文件与头文件(并且源文件中需要包含相关头文件),这不仅能锻炼你的模块化思维,还能及时定位是哪一个模块 ...

  4. fatal error LNK1169: 找到一个或多个多重定义的符号的 解决办法

    项目 –> 属性 –> 链接器 –> 命令行 –> 附加选项中 加 /force 虽然会有好多warning,但是能运行,没有大碍.

  5. 【转载】“error LNK1169: 找到一个或多个多重定义的符号”的解决方法

    c++的小细节的地方 原文地址:https://blog.csdn.net/xiaosu123/article/details/5665729 问题描述如下: 有 三个源文件,A.h.B.cpp.C. ...

  6. “error LNK1169: 找到一个或多个多重定义的符号”的解决方法

    问题描述如下: 有 三个源文件,A.h.B.cpp.C.cpp. A.h是头文件,其中声明了三个变量a1.a2. a3. B.cpp是A.h中所声明的类的实现源代码,C.cpp是主程序文件.B.cpp ...

  7. error LNK2005: “找到一个或多个多重定义的符号” 已经在 xxxx.obj 中定义 的解决方法

    error LNK2005: "找到一个或多个多重定义的符号" 已经在 xxxx.obj 中定义 的解决方法 参考文章: (1)error LNK2005: "找到一个或 ...

  8. LNK1169 找到一个或多个多重定义的符号

    LNK1169    找到一个或多个多重定义的符号 就是函数名重复了.

  9. LNK2005 _main 已经在 test0208.obj 中定义 / LNK1169 找到一个或多个多重定义的符号

    ** 错误 LNK2005 _main 已经在 test0208.obj 中定义 错误 LNK1169 找到一个或多个多重定义的符号 当我们遇到这个问题的时候先不要慌张,如果是英文报错先把翻译成中文, ...

最新文章

  1. 强烈安利!这个私藏已久的神器!
  2. 手机python软件怎么创建项目_创建成功的 Python 项目
  3. C++ 产生0-2之间的随机数
  4. mybatis对mapper.xml的解析(二)
  5. Redis 实践笔记
  6. About os.path
  7. 【AI视野·今日Robot 机器人论文速览 第二期】Mon, 7 Jun 2021
  8. Java中的标识符及其命名规则
  9. java 线程安全问题之静态变量、实例变量、局部变量
  10. keras读取训练好的模型参数并把参数赋值给其它模型
  11. vc6.0编译c++程序后在vc2008中调试的技巧(符号信息和链接)
  12. 什么是大数据和大数据平台?
  13. Mybatis执行插入语句后并返回主键ID
  14. 修身修心的1000+篇文章总结
  15. 详解Oracle架构、原理、进程,学会世间再无复杂架构
  16. FreeRTOS 队列管理
  17. 深度学习基础----吴恩达课后编程练习(一)识别猫
  18. ODBC连接数据库1
  19. 搭建USB摄像头转RTSP服务器的多种方法
  20. 安能饭否Android客户端

热门文章

  1. 几个so经常使用Function
  2. 关于jmf不能播放mp3的问题解决
  3. 了解javascript中函数执行顺序
  4. Android 常用权限
  5. Visual Studio 内存泄漏检测方法
  6. C语言宏定义##连接符和#符的使用及其它宏定义注意事项
  7. [原]第一次遭遇Oracle的Bug,纪念一下 |ORA-00600 kmgs_pre_process_request_6|
  8. vue.js开发环境搭建
  9. css --- [学习笔记]背景图片小结 css三大特性
  10. node --- 模块化连接MongoDB数据库的参数设置方案之一