5

我正在开发的软件使用全小写符号名称将 NETLIB BLAS/LAPACK 嵌入到其源中,但现在在将应用程序移植到 Windows 时,我发现英特尔 MKL 和该平台的其他几个 BLAS/LAPACK 实现使用全大写符号名字。有没有办法告诉 gnu 编译器/链接器在匹配符号名称时忽略大小写?

.
.
.
undefined reference to `_dgeqp3'
.
.
.

$ nm /lib/LAPACK.lib | grep -i " T _dgeqp3"
00000000 T _DGEQP3
4

3 回答 3

2

我想你可能会遇到一些麻烦。C 规范的第 6.4.2.1 节就标识符说“小写和大写字母是不同的”。这意味着就您的编译器和链接器而言,_DGEQP3它们_dgeqp3是不同的符号。您可能可以#define在特定于平台的标题中添加一些语句来为您排好队。

是因为您链接的是 Windows 库,而不是在此错误出现之前您使用的任何库吗?

于 2010-02-14T02:18:22.417 回答
2

您看到的差异是由于 Fortran 调用约定:在 Fortran 中,符号大小写并不重要,因此每个编译器都有将 Fortran 符号名称转换为汇编符号名称的方法:GNU 编译器通常将全部转换为小写,Windows 上的 Intel 去为大写。

如果您正在使用 Fortran 代码,则可以-fsymbol-case-upper在旧编译器上使用该选项g77(新gfortran编译器没有此选项)。否则,C 没有简单的答案,除了:

  • 使用#define_
  • 使用 BLAS 和 LAPACK 的 C 接口。
于 2010-02-16T20:25:53.470 回答
1

tc

#define __CONCAT(x,y) x##y

#ifdef SUFFIX
#define __SUFFIX(x) __CONCAT(x,_)
#else
#define __SUFFIX(x) x
#endif

#ifdef UPPER
#define __c(U,l) __SUFFIX(U)
#else
#define __c(U,l) __SUFFIX(l)
#endif

#define xaxpy __c(XAXPY, xaxpy)

#include <stdio.h>

char* xaxpy;
char* DAXPY;

int main()
{
    printf(xaxpy);
    printf(DAXPY);
}

欧共体

char* xaxpy  = "ln";
char* xaxpy_ = "ls";
char* XAXPY  = "UN";
char* XAXPY_ = "US";

似乎有一种方法可以在链接时使用以下方法引入符号别名--defsym

Cetin@BAKA-CHAN ~
$ gcc -D UPPER -D SUFFIX -c t.c e.c

Cetin@BAKA-CHAN ~
$ gcc -o t t.o e.o -Wl,--defsym=_DAXPY=_xaxpy

Cetin@BAKA-CHAN ~
$ ./t
USln
Cetin@BAKA-CHAN ~
$

还必须有一种方法可以为链接器提供不同的脚本来处理大量此类符号定义。所以我可以让它成为构建过程的一部分,以自动创建在不同案例之间创建映射的链接器脚本。

于 2010-02-14T18:51:24.970 回答