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++链接器工作原理的资料请关注脚本之家其它相关文章!