1 问题还原

这里我有三个源文件:Base.hpp, Base.cpp 和 main.cpp

在Base.hpp里面定义一个基类,注意,基类只包含构造函数和析构函数的声明,函数在Base.cpp里实现。

此外在Base.hpp中还有一个函数的定义(函数声明和定义都在Base.hpp文件中)三个文件代码如下。

Base.hpp
#ifndef VIRTUAL_H
#define VIRTUAL_H #include<iostream>
#include<string> using namespace std; class Base{
public:
Base(); ~Base(); private:
char *p;
}; void platform(Base *pBase){
cout << "this is just a function..." << endl;
} #endif

  

Base.cpp
#include"Base.hpp"

Base::Base(){
cout << "construction function..." << endl;
} Base::~Base(){
cout << "destructor function..." << endl;
delete p;
}

  

main.cpp
#include"Base.hpp"
#include<iostream>
using namespace std; int main(){
cout << "main..." << endl; Base * pBase = new Base;
delete pBase; system("pause");
return 0;
}

  

2 分析与解决方案

2.1 分析

定义类时,一般声明和实现分离,于是可将头文件中定义的类的构造函数,移到其对应的xxxx.cpp中,你会发现果然问题解决了。
实际上,xxxx.cpp由于包含了xxxx.h,而xxxx.h中包含了构造函数的实现,于是xxxx.cpp生成目标文件的时候,包含了构造函数的实现。而类的调用函数,如main.cpp也包含了xxxx.h,同样编译生成目标文件的时候,也会包含构造函数的实现。这样二者在链接阶段就会发现有两个一模一样的函数,出现了重定义的问题。

确定了这是由于两个实现文件(main.cpp 和 base.cpp)中重复包含了头文件而造成的。
要注意的是,在这里,在头文件中加入#ifndef……#endif这样的预编译命令是没用的,因为这是防止嵌套包含头文件的,而本例中并没有嵌套包含,是 在两个文件中分别包含。

2.2 解决

方法1:
只在头文件中声明函数,把函数定义都放到cpp文件中,本例中把platform函数的定义从Base.hpp文件中移到Base.cpp文件中。

把函数体放到cpp文件中后确实可行。

同理:如果在头文件中再定义一个变量:int a = 10; 那么由于头文件在两个cpp文件中都有被包含,也会出现类似的错误。

此时,需要把变量的定义放到Base.cpp文件中。

 方法2:

在xxxx.h的类的函数定义处,加上inline。这样实际上是在调用处展开函数体代码,代替函数调用。从而避免重复定义的问题。

头文件

class xxxxx
{
public: inline xxxxx(const Eigen::VectorXd &xData, const Eigen::VectorXd &yData);
private:
Eigen::VectorXd m_xData;
Eigen::VectorXd m_yData; }; xxxxx::xxxxx( const Eigen::VectorXd &xData, const Eigen::VectorXd &yData)
{
m_xData = xData;
m_yData = yData; }

参考文章

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

 

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

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

    解决方案: “error LNK1169: 找到一个或多个多重定义的符号”的解决方法(转载) 遇到的问题: 在.h头文件中采用namespace 命名空间报错 test.h namespace LMR ...

  2. error LNK1169 找到一个或多个多重定义的符号的解决方法

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

  3. fatal error LNK1169: 找到一个或多个多重定义的符号或多个.c/.cpp文件想同时调用定义在.h文件里面的全局变量,防止重定义变量问题。

    为什么.h文件中不能定义全局变量? 原因: 存在多次创建变量.如果头文件中可以定义全局变量,那么每个包含该头文件的文件里都会有该全局变量的定义.因为C语言的include是直接将文件嵌入到includ ...

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

    转载来自:http://www.cnblogs.com/A-Song/archive/2012/03/23/2413782.html 问题描述如下: 有 三个源文件,A.h.B.cpp.C.cpp. ...

  5. 全局变量重复定义,fatal error LNK1169: 找到一个或多个多重定义的符号

    1.在GlobeValue.h中定义了一个变量: char gl_UID[256]; 2.在b.cpp和e.cpp中分别引用GlobeValue.h,并且使用gl_UID的全局变量, 结果出现:fat ...

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

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

  7. 【error】C++:fatal error LNK1169: 找到一个或多个多重定义的符号

    编译时报错 : fatal error LNK1169: 找到一个或多个多重定义的符号 解答: 发生这种错误就是在一个项目定义了多个main函数的问题. *C++中一个项目即一个程序,多个文件只能有一 ...

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

    本人在测试刚刚安装的vs2017时运行出了问题, 错误信息为 "fatal error LNK1169: 找到一个或多个多重定义的符号", 代码如下: //Myfile.h #in ...

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

    申明全局变量,全局函数一定要在cpp中申明,其他类引用该全局变量就include该cpp的h文件,然后extern一下就好了.否则容易出现该重复定义错误. 这个"容易"是如何解释的 ...

随机推荐

  1. Oracle - 数据库的实例、表空间、用户、表之间关系

    完整的Oracle数据库通常由两部分组成:Oracle数据库和数据库实例. 1) 数据库是一系列物理文件的集合(数据文件,控制文件,联机日志,参数文件等): 2) Oracle数据库实例则是一组Ora ...

  2. 技术英文单词贴--B

    B breadcrumb 面包屑 bubble 冒泡

  3. .Net规则引擎Biztalk,Workflow和CKRule的比较

    微软的规则引擎   很多朋友会问,.Net平台有没有规则引擎?像Java就有很多的规则引擎,Drools,ILog都做得非常好,但.Net好像还没有哦.很多知道规则引擎,但不知道.Net的朋友都烦这个 ...

  4. bzoj1221

    网络流与线性规划24题中的餐巾计划吧明显要拆点吧,把每一天拆成2个点,i,i+n起点   终点    容量    费用 s      i      inf      c    每天都可以购买新毛巾 i ...

  5. Linux中输入命令按tab提示后会自动转义解决方案(xjl456852原创)

    linux在命令行输入命令时,如果有$字符,按tab键时会自动在前面加入转义字符,反而达不到自己需要的效果. 例如: 在Centos7下,我要进入一个环境变量,并编辑一个文件: 比如我要进入$JAVA ...

  6. Python练手例子(4)

    16.一个数如果恰好等于它的因子之和,这个数就称为"完数".例如6=1+2+3.编程找出1000以内的所有完数. 程序分析:请参照程序Python 100例中的第14个例子 #py ...

  7. ActiveMQ消息的发送原理

    持久化消息和非持久化消息的发送策略:消息同步发送和异步发送 ActiveMQ支持同步.异步两种发送模式将消息发送到broker上.同步发送过程中,发送者发送一条消息会阻塞直到broker反馈一个确认消 ...

  8. snmp对超过16T的磁盘大小识别不对的解决办法

    https://blog.csdn.net/redleaf0000/article/details/38303299

  9. 解决tomcat启动慢问题

    启动慢修改如下: 在catalina.sh中加入这么一行: JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom" 打开$JAVA_ ...

  10. 给你一个全自动的屏幕适配方案(基于SW方案)!—— 解放你和UI的双手

    Calces系列相关文章:Calces自动实现Android组件化模块构建 前言 屏幕适配一直是移动端开发热议的问题,但是适配方案往往在实际开发的时候会和UI提供的设计稿冲突.本文主要是基于官方推荐的 ...