0

私は Cygwin によってウィンドウ 7 で OpenOCD を構築していて、このメッセージを受け取りました

openocd-0.7.0/jimtcl/jim.c:3009: undefined reference to `isascii'
collect2: error: ld returned 1 exit status
Makefile:45: recipe for target 'jimsh.exe' failed
make[2]: *** [jimsh.exe] Error 1

「isascii」のライブラリが Cygwin に存在しない可能性があります。次の手順に従って構築しました。

http://www.tincantools.com/wiki/Compiling_OpenOCD_Win7

4

1 に答える 1

2

MinGW ディストリビューションでも同じ問題が発生します。http://pubs.opengroup.org/onlinepubs/009696699/basedefs/ctype.h.htmlにあるように、でisascii()定義されて<ctype.h>いる は ISO C 標準の拡張です。したがって、必要ありません。前述のように、アンダースコアのない名前は、Visual C++ 2005 ランタイム ライブラリ以降では非推奨です (古い MSVCRT ランタイムをインストールしても役に立ちません)。

したがって、__isascii()バリアントの使用は正しいです。

ただし、GCC 4.6.1 を使用した MinGW ランタイムの古いインストールはisascii()、エラーを発生させずに受け入れます。これは、GCC がリンクに使用するライブラリの 1 つlibmoldname.a( ) で定義されているためです。-lmoldnameMinGW の最近のバージョンではlibmoldname.a、 を含むいくつかの古い関数を削除するように変更されましたisascii()。このライブラリからオブジェクト ファイルisascii.oが削除されました。これらのリンクは、この削除に関連しています:

sourceforge.net/apps/trac/mingw-w64/changeset/5807/trunk

sourceforge.net/p/mingw-w64/mailman/mingw-w64-public/thread/51751223.2020804@videolan.org/

http://marc.info/?l=mingw-patches&m=107980328623432

残念ながら、<ctype.h>まだアンダースコアなしで定義していisascii()ます。したがって、このエラーはリンク段階でのみ表示されます。

何らかの理由でコードを変更できない場合は、古いバージョンの MinGW または Cygwin を使用してビルドしてください。ディストリビューションがタイプをサポートしているかどうかを確認するにはisascii():

objdump -t c:/mingw/lib/libmoldname.a | grep "isascii" 

出力は空 (サポートなし) または次のいずれかになります。

isascii.o:     file format pe-i386
[  0](sec -2)(fl 0x00)(ty   0)(scl 103) (nx 1) 0x00000000 isascii.c
[  2](sec  1)(fl 0x00)(ty  20)(scl   2) (nx 1) 0x00000000 _isascii

-lmoldnameところで、に追加する必要はありません。GCC$LDFLAGSはこのライブラリを自動的に追加します。

于 2014-04-09T09:41:34.363 に答える