我正在尝试链接 OSX 中的 BLAS 实现(/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
出于好奇),但我不想链接libLAPACK.dylib
到同一个目录中的 BLAS 实现,因为我想使用来自 netlib 的我自己的 LAPACK 构建,因为它很多更新和最新的。
我的问题是 BLAS 库中的符号通常存储在 LAPACK 库中,因此会导致名称冲突。作为一个具体的例子,spotrf
函数定义在libBLAS.dylib
:
$ nm /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib | grep spotrf
0000000000010c05 T $ld$hide$os10.7$_spotrf
0000000000010c05 T $ld$hide$os10.8$_spotrf
000000000000746e T _spotrf
前两个符号让我有点怀疑,所以为了仔细检查,我也检查了一下libLAPACK.dylib
:
$ nm /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLAPACK.dylib | grep spotrf
00000000000010c8 T $ld$hide$os10.4$_spotrf
00000000000010c8 T $ld$hide$os10.5$_spotrf
00000000000010c8 T $ld$hide$os10.6$_spotrf
000000000000765b T _spotrf
从我能找到的有限信息来看,如果用户针对给定的 OSX 版本进行编译,这个前缀似乎会以某种方式指示动态链接器忽略这些符号。libBLAS.dylib
如果 Apple 将符号从 10.6移到libLAPACK.dylib
10.7 之间,这是有道理的。
我的问题是,我怎样才能通知动态链接器它应该隐藏spotrf
等等......在里面libBLAS.dylib
?