Version 14 of How to compile Tcl and related C extensions on Windows

Updated 2002-11-21 23:45:24

Purpose: gather together tips and techniques, tool recommendations, etc. for compiling Tcl and related extensions on a Windows machine.


Steve Blinkhorn wrote on comp.lang.tcl recently [change this into a google reference to [email protected]] praising the Mingw C compiler distribution as being the way one can compile the same code on windows as well as various unix systems.

[Re: cross-platform compiles - Is there a version of mingw for MacOS? For Mac OS <=9, no there isn't (at least not that I know of), but for Mac OS X, of course there is 'gcc' as standard.]


Those who have the financial wherewithall to buy Visual C++ have been advocating its use, as the executables are better.


Many times Window developers attempt to compile Tcl and Tk using the Cygnus Cygwin Windows development environment, since that's what they use for other projects.

For reasons that at least one non-Windows developer does not understand, Tcl doesn't compile with the default Cygnus environment. Thus, people keep telling people to use the Mingw C compiler mentioned above.


Another popular free C compiler is the Borland C compiler. See Helmut Giese's comp.lang.tcl article titled Borland support: Wrapping it all up from Mon, 29 Jul 2002 19:29:28 GMT, [Perhaps someone can turn this into a groups.google.com thread URL? Message-ID: <[email protected] ] in which Helmut volunteers info on using Borland compiler to build Tcl.


Another commonly discussed technique is using a Linux machine and cross compiling to generate Windows binaries. [Someone have some URLs or wiki references here?]

I have seen notes indicating that Tcl and Tk can be compiled using the gcc free compiler in unix as well as Win32 (EGCS, FSF, cygwin32, mingw32) [There's duplication between this text and that in "C Language".] environments. Also, Win32's lcc should work. See http://www.xraylith.wisc.edu/%7Ekhan/software/gnu-win32/ , http://www.xraylith.wisc.edu/%7Ekhan/software/tcl/ , http://www.cygnus.com/misc/gnu-win32/ , http://sourceware.cygnus.com/cygwin/ , http://www.cs.virginia.edu/%7Elcc-win32 , ftp://ftp.franken.de/pub/win32/develop/gnuwin32/mingw32/porters/Mikey/ , ftp://ftp.freesoftware.com/pub/sourceware/cygwin/latest/setup.exe , ftp://ftp.yggdrasil.com/mirrors/site/sourceware.cygnus.com/pub/cygwin/latest/ , ftp://ftp.freesoftware.com/pub/sourceware/cygwin/latest/ , http://www.hwaci.com/sw/mktclapp/win32-compile.html

Be sure that you understand http://sources.redhat.com/cygwin/faq/faq_9.html#SEC145 very well, perhaps even discussing it with a lawyer, before using cygwin to produce software you wish to sell. Nothing there prevents you from doing this - however, there are a variety of considerations that one needs to make, when using tools some of which are covered by the GPL.


"Packers ..." [L1 ] describes a variety of products of interest to those involved in application-level obfuscation, compression, and so on.


To build Tcl using VC++ open a command prompt in the win directory of the source and type the following two commands:

First call vcvars32.bat to setup the environment. This is located in vc\bin of VC++ 5.0 or vc98\bin for VC++ 6.0.

 Microsoft Windows 2000 [Version 5.00.2195]
 (C) Copyright 1985-2000 Microsoft Corp.

 D:\tcl_workspace\tcl_head_stock\win>c:\dev\devstudio60\vc98\bin\vcvars32.bat
 Setting environment for using Microsoft Visual C++ tools.
 D:\tcl_workspace\tcl_head_stock\win>

Next, invoke the makefile, called makefile.vc:

 D:\tcl_workspace\tcl_head_stock\win>nmake -f makefile.vc

 Microsoft (R) Program Maintenance Utility   Version 6.00.8168.0
 Copyright (C) Microsoft Corp 1988-1998. All rights reserved.

 ===============================================================================
 *** Compiler has 'Optimizations'
 *** Compiler has 'Pentium 0x0f fix'
 *** Linker has 'Win98 alignment problem'
 *** Intermediate directory will be '.\Release\tcl_Dynamic'
 *** Output directory will be '.\Release'
 *** Suffix for binaries will be ''
 *** Optional defines are ''
 *** Dependency rules are not being used.

        cl -nologo -c -W3 -YX -Fp.\Release\tcl_Dynamic\ -QI0f -O2 -Op -Gs -MD -I
 "..\win" -I"..\generic"  -Fo.\Release\tcl_Dynamic\tclAppInit.obj ..\win\tclAppIn
 it.c
 tclAppInit.c
        rc -fo .\Release\tcl_Dynamic\tclsh.res -r -i "..\generic" -D__WIN32__  .
 .\win\tclsh.rc
        cl -O2 -Op -Gs -nologo -c -W3 -YX -Fp.\Release\tcl_Dynamic\ -QI0f -Zl -D
 STATIC_BUILD -I"..\win" -I"..\generic" -Fo.\Release\tcl_Dynamic\tclStubLib.obj .
 .\generic\tclStubLib.c
 tclStubLib.c

 ...etc...

Numerous targets and options exist. Read the top of makefile.vc itself for all the details. -- DG