C++链接器工作原理详解

 更新时间:2024年02月11日 09:46:01   作者:我叫大健  
当文件见过编译后就需要进行一个链接的操作接下来我们就说说什么是链接,本文给大家介绍了C++链接器是如何工作的,文章通过代码示例和图文介绍的非常详细,需要的朋友可以参考下

当文件见过编译后就需要进行一个链接的操作接下来我们就说说什么是链接

接下来我展示一些例子:

#include<iostream>
 
void Log(const char* message)
{
	std::cout << message << std::endl;
}
 
int Multiply(int a, int b)
{
	Log("Multiply");
	return a * b;
}

这是一段非常简单的代码,它有一个Log函数和一个Multiply函数其中Multiply调用了Log函数然后返回a*b的值。发现没用它没有主函数main,所以他其实并不是一个完整的程序,首先我们要意思到,编译是两个阶段的编译个链接,接下来哦我们用这段代码来展示一下他们的区别。

这段代码复制到vs中,如果我们按ctrl+F7可以发现这段代码他是不报啥错的,一切是正常的,以为编译生成了obj目标文件。

那么如果我们是右键生成,可以发现会有一个LNK的报错,这个就是链接错误。

那怎么解决这个错误呢?我们添加一个main函数就可以了(因为我们缺少了入口函数)

接着我们把这段代码补全,然后运行一下,可以看到代码是可以正确运行的。

我们假设有很多的cpp文件,所以就需要一个log日志文件,把log函数放到log.ccpp中,然后运行一下,可以看到成功编译了。

接下来,我看看一个非常有意思的错误,改成下面这段代码.

log.cpp
#include<iostream>
 
void Logr(const char* message)
{
	std::cout << message << std::endl;
}
 
 
 
Multiply.cpp
#include<iostream>
 
void Log(const char* message);
int Multiply(int a, int b)
{
	//Log("Multiply");
	return a * b;
}
 
int main()
{
	std::cout << Multiply(8, 5) << std::endl;
	std::cin.get();
}

这样我们一看就知道这段代码是可以正常编译的,因为我们把log函数注释了,但是如果我们是注释的Multiply这个调用的?你们猜猜这个还可以正常编译吗?看看结果,没错他报错了(链接错误),按正常来说我们注释了Multiply这个调用,那log不是也就没用到(log在Multiply函数中),那应该是对的才对啊!并不是这样的,因为在文件汇中,虽然我们没用用到Multiply函数,但是从技术上来说我们是可能在其他地方用到他的,所以连接器就需要链接他就会报错(因为找不到嘛),那么只要告诉链接器,Multiply不会再其他地方用到只会再这个里面用到就可以解决这个问题了,怎么解决呢?加一个static(这意味着Multiply函数只声明在Multiply.cpp中),我们试试。好了,不报错了,很神奇吧!总的来说就是如果编译器找不到确切的函数定义,就会有链接错误

以上就是C++链接器工作原理详解的详细内容,更多关于C++链接器工作原理的资料请关注脚本之家其它相关文章!

相关文章

  • C++使用ifstream读取文件内容的示例详解

    C++使用ifstream读取文件内容的示例详解

    这篇文章主要为大家详细介绍了C++如何使用ifstream读取文件内容的功能,文中的示例代码讲解详细,具有一定的参考价值,感兴趣的可以了解一下
    2023-03-03
  • C语言算法练习之佩奇借书

    C语言算法练习之佩奇借书

    这篇文章主要该大家分享C语言佩奇借书的练习,文章主要通过描述佩奇借书的问题然后确定程序框架将结果运算出来,下面来看详细内容吧,需要的朋友可以参考一下
    2022-03-03
  • C语言进阶二叉树的基础与销毁及层序遍历详解

    C语言进阶二叉树的基础与销毁及层序遍历详解

    朋友们好,这篇播客我们继续C++的初阶学习,现在对我们对C++的二叉树基础oj与二叉树销毁和层序遍历进行练习,让我们相互学习,共同进步
    2022-06-06
  • 优先队列(priority_queue)的C语言实现代码

    优先队列(priority_queue)的C语言实现代码

    本文简要介绍一种基于数组二叉堆实现的优先队列,定义的数据结构和实现的函数接口说明如下
    2013-10-10
  • VC++中图像处理类CBitmap的用法

    VC++中图像处理类CBitmap的用法

    使用VC进行图像处理的时候,CBitmap类为我们提供了丰富的位图处理函数,本文总结了该类的相关函数和常用使用方法,包括加载位图,显示位图,析构CBitmap资源以及在内存中保存位图等内容。
    2015-11-11
  • 探究c++虚表实现代码

    探究c++虚表实现代码

    虚表是一种利用程序语言实现的dynamic dispatch机制,或者说runtime method binding机制,也就是我们说的多态。本文简单探究虚表实现方法,一起看看吧
    2021-09-09
  • C++图论之Bellman-Ford算法和SPFA算法的实现

    C++图论之Bellman-Ford算法和SPFA算法的实现

    贝尔曼-福特算法(Bellman-Ford)是由理查德·贝尔曼和莱斯特·福特创立的,求解单源最短路径问题的一种算法。SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径。本文将详解两个算法的实现,需要的可以参考一下
    2022-06-06
  • 深入探讨:main函数执行完毕后,是否可能会再执行一段代码?

    深入探讨:main函数执行完毕后,是否可能会再执行一段代码?

    本篇文章是对main函数执行完毕后,是否可能会再执行一段代码,进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • c语言的注释定界符详解

    c语言的注释定界符详解

    在本文里小编给大家分享的是关于c语言的注释定界符知识点详解,需要的朋友们可以跟着学习下。
    2020-02-02
  • c++ 求数组最大最小值函数的实现

    c++ 求数组最大最小值函数的实现

    这篇文章主要介绍了c++ 求数组最大最小值函数的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07

最新评论