模板多文件编译

c++模板类多文件编译

解决方案

  1. 直接包含cpp文件
  2. 将声明和实现写在同一个hpp文件中,之后引用该文件

主流方式是采用第二种,简单

分文件编写出现问题的原因

c++编译过程

预编译,编译,链接

预编译过程

在预编译过程中,会进行一些最基本的操作

  1. 将#define宏定义替换,是文本操作,不会进行类型检查等等,而是直接将文本进行替换
  2. 执行条件编译,#ifdef,#ifndef,#else,#enfid,#elif等,
  3. 对#include宏进行替换,也就是把#include所引用的头文件中的内容原封不动的插入在当前行的位置并把当前这一行替换掉因此可能会存在重复引用这个时候上面的条件编译就会排上用场。
  4. 删除注释
编译过程

编译分为两个过程,分别是编译和汇编
编译过程将会检查程序中的语法错误,若没有错误则会将程序转换成汇编语言,生成.s文件
汇编过程会将汇编语言的程序转换为机器语言,生成.o文件

此过程就会涉及到分文件编译

c++编译得一个特点就是分文件编译,也就是每一个.cpp文件都会单独进行编译,也就是说每一个.cpp都会单独生成一个目标文件,但是一个文件可能引用了另外一个文件,所以还需要链接过程

链接过程

由汇编程序生成的目标文件并不能立即就被执行,其中可能还有许多没有解决的问题。
例如,某个源文件中的函数可能运用了另外一个源文件中定义的某个符号(如变量或者函数调用等);在程序中可能调用了某个库文件中的函数等等。所有这些问题都需要经链接程序的处理方能解决。

链接程序的主要工作就是将有关的目标文件彼此相连结,也即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够呗操作系统装入执行的统一整体

链接方式
静态链接

在这种链接方式下,函数的代码将从其所在的静态链接库中被拷贝到最终的可执行程序中。这样该程序在被执行的时这些代码将被装入到该进程的虚拟地址空间中。静态链接库实际上是一个目标文件的集合,其中每个文件含有库中的一个或者一组相关函数的代码。

动态链接

在此种方式下,函数的代码被放到称作是动态链接库或共享对象的某个文件中。链接程序此时所做的只是在最终的可执行程序中记录下共享对象的名字以及其他少量登记信息。在此可执行文件被执行的时候动态链接库的全部内容将被映射到运行时相应进程的虚拟地址空间。动态链接程序将根据可执行程序中记录的信息找到相应的函数代码。

优劣

对于可执行文件中的函数调用,可分别采用动态链接或静态链接的方法。使用动态链接能够使最终的可执行文件比较短小,并且当共享对象被多个进程使用时能节约一些内存,因为在内存中只需要保存一份此共享对象的代码。但并不是使用动态链接就一定比使用静态链接要优越。在某些情况下动态链接可能带来一些性能上损害。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值