求助:链接器原理
今天突发奇想:链接器是怎么找到我要用的库函数的?
然后,想了半天,毫无头绪,遂编个代码看看
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
float a,b;
while(cin>>a>>b)
{
cout<<pow(a,b)<<endl;
}
return 0;
}
查看头文件math.h,找到如下声明:
_CRTIMP double __cdecl pow (double, double);
将此声明替换掉头文件math.h的声明,程序能编译,再删除这行,编译出错。
那么,就应该是这个声明告诉编译器到哪里去找到函数pow了,但是,问题又来了:编译器到底是在哪里找到了pow函数呢?
接着上网查了下,是在C运行时库CRT里找到的,但是,还有问题:CRT是在我的Windows操作系统中的一个dll里的么?那么别的操作系统也要实现这个类似的动态链接库吗?那如果操作系统没有类似的动态链接库,是不是编译器就不能正常工作了呢?还有,生成的.exe中的pow函数部分是静态链接还是运行时再动态链接呢?新手上路,问题好多,多点分吧。。。
然后,想了半天,毫无头绪,遂编个代码看看
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
float a,b;
while(cin>>a>>b)
{
cout<<pow(a,b)<<endl;
}
return 0;
}
查看头文件math.h,找到如下声明:
_CRTIMP double __cdecl pow (double, double);
将此声明替换掉头文件math.h的声明,程序能编译,再删除这行,编译出错。
那么,就应该是这个声明告诉编译器到哪里去找到函数pow了,但是,问题又来了:编译器到底是在哪里找到了pow函数呢?
接着上网查了下,是在C运行时库CRT里找到的,但是,还有问题:CRT是在我的Windows操作系统中的一个dll里的么?那么别的操作系统也要实现这个类似的动态链接库吗?那如果操作系统没有类似的动态链接库,是不是编译器就不能正常工作了呢?还有,生成的.exe中的pow函数部分是静态链接还是运行时再动态链接呢?新手上路,问题好多,多点分吧。。。
...全文
相关推荐
FreeRTOS 解决arm编译器 compiler vision6 V6不能用的问题
要解决“FreeRTOS不能用”的问题,可以尝试以下步骤:1. **检查编译选项**:确保编译选项与V6编译器兼容。可能需要更新链接器脚本,以匹配新版本编译器的输出格式。
linux 下才变成
在Linux系统中,链接器(ld)负责将编译后的目标文件和各种库文件链接成单一的可执行文件。当程序中使用到标准库或其他库提供的函数时,需要在链接阶段指定相应的库文件。
链接器和装入器的基本工作原理
### 链接器与装入器的基本工作原理#### 引言在现代软件开发过程中,一个程序从源代码到能在计算机上运行,需要经历多个阶段,包括编译、链接以及装入等。其中,链接器和装入器扮演着重要的角色。
link 32位和64位链接器
这个压缩包可能包含了不同版本的链接器,帮助开发者在不同环境中完成程序构建。总之,了解和掌握32位和64位链接器的工作原理对于开发人员来说至关重要,因为它直接影响到程序的性能、兼容性和可移植性。
【C语言】链接器介绍
C语言连接器是整合编译器或汇编器生成的目标模块为可执行文件的工具,处理外部对象合并与命名冲突。它将目标模块视为外部对象集合,通过外部名称识别,并检查载入模块中的同名对象以处理冲突。连接器通常与编译器分离,但共同协作完成程序构建。


community_281
