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

也许 Cygwin 中不存在“isascii”的库,我按照以下步骤进行构建:

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()而不会出现错误。这是因为它是在libmoldname.a( -lmoldname) 中定义的——GCC 用于链接的库之一。在最近的 MinGW 版本中,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$LDFLAGSGCC会自动添加这个库。

于 2014-04-09T09:41:34.363 回答