gcc在链接时忽略符号名称的大小写

时间:2010-02-14 00:54:25

标签: gcc linker symbols case-insensitive

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

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

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

3 个答案:

答案 0 :(得分:2)

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

是不是因为你链接到了一个Windows库而不是你之前使用的那个错误?

答案 1 :(得分:2)

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

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

  • 使用#define
  • 使用C接口连接BLAS和LAPACK。

答案 2 :(得分:1)

T.C

#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);
}

e.c

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 ~
$

还必须有一种方法可以为链接器提供不同的脚本来处理大量此类符号定义。因此,我可以将其作为构建过程的一部分,以自动创建在不同情况之间创建映射的链接描述文件。