Fortran Coder

查看: 12146|回复: 9
打印 上一主题 下一主题

[数学库] MKL的各类子程序重定位问题

[复制链接]

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

楼主
发表于 2014-6-30 16:47:59 | 显示全部楼层
山大克鲁士 发表于 2014-6-30 15:55
为啥链接器不会报错呢?例如:unresolved external symbol _DGEMM难道链接器不是根据函数名+参数列表,来确 ...

不是。

显示链接DLL,链接过程并不寻找dll中的真实地址。这个过程在exe加载时完成。
也就是说,exe加载运行时,才去寻找dll的真实地址。

链接时,由导入库(一般为lib)来确定函数名,参数列表。并将dll的名字,dll中的函数名写入exe里,以便运行时查找。

导入库,负责把函数名由符号,转变为dll的寻找线索(dll名和函数导出名),然后在运行时根据线索得到dll的真实地址。

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

沙发
发表于 2014-6-30 16:50:47 | 显示全部楼层
mangix2010 发表于 2014-6-30 16:11
为什么函数名字可以不一样那?

这主要是出于多函数库使用时,避免名称冲突。

比如,某个函数库里有 OpenFile,另一个函数库里也有这个同名函数。同时,编译器提供的运行时库里可能也有。

怎么办?链接时很容易发生重名的情况。
所以,不同的函数库,运行时库,会在函数名的前面后面增加一些前后缀,甚至对函数名进行某些变换。这样减少重名的可能性。

由于这些前后缀或变换是因编译器或函数库而不同的,所以,没有必要让程序员了解具体的细节。因此,这个函数名的转换过程也由编译器自动完成,而无需干涉。

程序员只要做好函数库的设置,或调用协定就可以了。

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

板凳
发表于 2014-7-1 14:22:49 | 显示全部楼层
山大克鲁士 发表于 2014-7-1 13:32
现在的问题是,他dll的出口函数中只有mkl_blas_dgemm,但是头文件中确是DGEMM,而且没有出现任何与函数名 ...

因为有导入库啊。lib里有代码表明 DGEMM 对应什么DLL的导出函数。

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

地板
发表于 2014-7-3 00:13:25 | 显示全部楼层
山大克鲁士 发表于 2014-7-2 22:42
导入库我dumpbin在帖子的图里面了,大神能指点下是哪一段吗?

对 lib 文件的 COFF 格式没有太多了解,也没你那么爱刨根问底。

可以肯定的是,dumpbin 会输出所有的符号名称(即供给链接程序的名称)。

我不肯定的是,dumpbin 是否会输出在 DLL 里的导入函数名称。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-3 02:09

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表