我是从github下的tcl-core-9-0-a1版本,解压后进入源码目录,执行以下命令
mkdir bld
cd bld
../unix/configure
make -j12
出现如下错误
/d/tcl-core-9-0-a1/generic/tclCmdAH.c:2151:63: 错误:‘Tcl_StatBuf’ {或称 ‘struct <匿名>’}没有名为‘st_blocks’的成员
2151 | STORE_ARY("blocks", Tcl_NewWideIntObj((Tcl_WideInt)statPtr->st_blocks));
| ^~
/d/tcl-core-9-0-a1/generic/tclCmdAH.c:2132:14: 附注:in definition of macro ‘STORE_ARY’
2132 | value = (object); \
| ^~~~~~
/d/tcl-core-9-0-a1/generic/tclCmdAH.c:2154:59: 错误:‘Tcl_StatBuf’ {或称 ‘struct <匿名>’} has no member named ‘st_blksize’; did you mean ‘st_size’?
2154 | STORE_ARY("blksize", Tcl_NewWideIntObj((long)statPtr->st_blksize));
打开tcl的314行,注释掉下面代码
/* #elif defined(__CYGWIN__)
typedef struct {
dev_t st_dev;
unsigned short st_ino;
unsigned short st_mode;
short st_nlink;
short st_uid;
short st_gid;
/* Here is a 2-byte gap */
dev_t st_rdev;
/* Here is a 4-byte gap */
long long st_size;
struct {long long tv_sec;} st_atim;
struct {long long tv_sec;} st_mtim;
struct {long long tv_sec;} st_ctim;
} Tcl_StatBuf; */
接下来再编译,错误如下
gcc -O2 -pipe tclAppInit.o \
-L/d/tcl-core-9-0-a1/bld -ltcl9.0 libtclstub9.0.a -lpthread \
-o tclsh.exe
/usr/lib/gcc/x86_64-pc-msys/9.3.0/../../../../x86_64-pc-msys/bin/ld: /d/tcl-core-9-0-a1/bld/libtcl9.0.a(tclPanic.o):tclPanic.c:(.text+0x8c): undefined reference to `tclWinDebugPanic'
/d/tcl-core-9-0-a1/bld/libtcl9.0.a(tclPanic.o):tclPanic.c:(.text+0x8c): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `tclWinDebugPanic'
/usr/lib/gcc/x86_64-pc-msys/9.3.0/../../../../x86_64-pc-msys/bin/ld: /d/tcl-core-9-0-a1/bld/libtcl9.0.a(tclStubInit.o):tclStubInit.c:(.rdata+0x1790): undefined reference to `TclWinConvertError'
/usr/lib/gcc/x86_64-pc-msys/9.3.0/../../../../x86_64-pc-msys/bin/ld: /d/tcl-core-9-0-a1/bld/libtcl9.0.a(tclUnixFCmd.o):tclUnixFCmd.c:(.text+0x3b7): undefined reference to `TclWinConvertError'
/d/tcl-core-9-0-a1/bld/libtcl9.0.a(tclUnixFCmd.o):tclUnixFCmd.c:(.text+0x3b7): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `TclWinConvertError'
collect2: 错误:ld 返回 1
make: *** [Makefile:818:tclsh.exe] 错误 1
修改如下,首先在tclPanic.c的101行注释掉
// tclWinDebugPanic(format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
在tclStubInit.c的491行改为
#if 1//!defined(_WIN32) && !defined(__CYGWIN__) && !defined(MAC_OSX_TCL) /* UNIX */
在tclStubInit.c的524行改为
#if 0//defined(_WIN32) || defined(__CYGWIN__) /* WIN */
最后在tclUnixFCmd.c的2365行注释掉
// TclWinConvertError(GetLastError());
编译完后把tclsh.exe移到/usr/bin文件夹,把编译的libtcl8.7.a和libtclsub8.7.a还有源码目录的library下所有文件移到/mingw64/lib/tcl8.7
接着执行下列命令拷贝头文件
cp -i *.h /mingw64/include/tcl8.7