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

表示されている違いは、Fortran の呼び出し規則によるものです。Fortran では、シンボルの大文字と小文字は重要ではないため、すべてのコンパイラには、Fortran のシンボル名をアセンブラのシンボル名に変換する方法があります。GNU コンパイラは通常、すべてを小文字に変換しますが、Windows の Intel は大文字用。

Fortran コードを使用している-fsymbol-case-upper場合は、古いコンパイラでこのオプションを使用できますg77(新しいgfortranコンパイラにはこれがありません)。それ以外の場合、次の場合を除き、C の簡単な答えはありません。

  • #defineの使用
  • BLAS および LAPACK への C インターフェイスを使用します。
于 2010-02-16T20:25:53.470 に答える
2

ご迷惑をおかけすることもあると思います。C仕様のセクション6.4.2.1は、識別子に関して「小文字と大文字は区別される」と述べています。これは、コンパイラとリンカーに関する限り、異なるシンボル_DGEQP3であることを意味します。_dgeqp3おそらく#define、プラットフォーム固有のヘッダーにいくつかのステートメントを追加して、並べ替えることができます。

このバグが発生したのは、以前に使用していたものではなく、Windows ライブラリに対してリンクしているためですか?

于 2010-02-14T02:18:22.417 に答える
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);
}

ec

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 に答える