基于msys2的tcl源码构建

我是从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

猜你喜欢

转载自blog.csdn.net/pfysw/article/details/107889728