'''How to compile Tcl and related C extensions on Windows''' presents tips and techniques, tool recommendations, etc. for compiling Tcl and related extensions on a Windows machine. ** See Also ** [C]: [Building Tcl/Tk with Mingw]: [Microsoft C compiler and Tcl]: [TEA]: [Building Tcl DLL's for Windows]: [How to create mingw32 libraries from DLLs]: ** VC++ ** '''See Also:''' [How to create a minimal Visual C++ install]: Users that have VC++ installed can use it to build Tcl/Tk under Windows. Users that wish to use the gcc compiler to build Tcl/Tk under Windows should see [Building Tcl/Tk with Mingw]. Building Tcl/Tk under Cygwin is not supported. Those who have the financial wherewithal to buy Visual C++ have been advocating its use, as the executables are ''better''. But wait--does use of Microsoft's C compiler require money? "[Microsoft C compiler and Tcl]" [DG]: 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. ======none 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: ======none 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. ---- [HaO] 2010-12-15: Since Tk 8.5, you need the win server 2000 sp1 platform sdk ([How to create a minimal Visual C++ install]) and and the command ''SetEnv.cmd /RELEASE'' ([http://wiki.tcl.tk/972%|%Annotated 10 steps to success with TEA]). ---- The define of STATIC_BUILD is important when compiling with Visual C 6, as tcl.h does import and export macros differently based on the symbol. If you get unresolved references to _imp_SomeSymbol, this may be something worth pursuing for a resolution. But STATIC_BUILD is set correctly by makefile.vc and the TEA build system already. The only point of contension is when one links to tcl84s.lib that -DSTATIC_BUILD should have been used on the sources when compiled for projects using Tcl. How Tcl builds itself is already managed by the makefiles. If in fact, one is compiling Tcl using an alternate method, yes, they had better set all the macros correctly and for that I agree. -- [DG] ---- [HaO] 2010-12-15: The title does not say ''How to Compile Tk'', but when I try compiling Tk 8.5.9 debug with MS-VC6, win server 2000 sp1 platform sdk and the makefile in the win folder, I get the error ''debugging information corrupt; recompile module''. Shell trace: ======none C:\test\tk8.5.9\win>nmake -f makefile.vc release OPTS=symbols INSTALLDIR=c:\test\tcl859d TCLDIR=c:\test\tcl8.5.9 ...(compile steps cut)... link -nologo -machine:IX86 -debug:full -debugtype:cv -opt:nowin98 -dll -base:@"c:\test\tcl8.5.9\win\coffbase.txt",tk -out:".\Debug \tk85g.dll" kernel32.lib user32.lib gdi32.lib "c:\test\tcl8.5.9\win\Debug\tclstub85.lib" @C:\Users\oehhar\AppData\Local\Temp\nm9F4A.tmp Creating library .\Debug\tk85g.lib and object .\Debug\tk85g.exp uuid.lib(cguid_i.obj) : fatal error LNK1103: debugging information corrupt; recompile module NMAKE : fatal error U1077: 'link' : return code '0x44f' Stop. ======none [http://blogs.msdn.com/b/stephen_griffin/archive/2006/08/03/building-mfcmapi-with-visual-studio-6.aspx%|%Building MFCMAPI With Visual Studio 6], Stephen Griffin, 2006-08-03, proposes to exchange the library ''uuid.lib'' of the platform sdk by the version of vc98. This worked for me. ---- [RS] 2008-09-24: We see that self-compiled [tclsh] can no longer be run on a different target machine (both being Windows XP): ======none C:\tmp\tcldist_8.5.4\bin>.\tclsh The system cannot execute the specified program. ====== In File Monitor, we see failed accesses to some .Manifest and .Config: ====== 16:56:14 wish85.exe:1912 OPEN C:\tmp\tcldist_8.5.4\bin\tclsh85.exe.Manifest NOT FOUND Options: Open Access: 001200A9 16:56:14 wish85.exe:1912 OPEN C:\tmp\tcldist_8.5.4\bin\tclsh85.exe.Config NOT FOUND Options: Open Access: 001200A9 ====== An ActiveTcl 8.5 could be installed without problem on the trouble machine. What do we do wrong? How to build [tclsh] so that it can be deployed to target machines? [LV] In looking through tcl 8.5.4 source files, I run across this note in tcl/win/rules.vc: === # MSVC8 (ships with Visual Studio 2005) generates a manifest # file that we should link into the binaries. This is how. === So that looks like the source of the error you are seeing. I don't know windows software development well enough to understand what a "manifest resource" is... ** SUA ** Another option for ''some'' Windows users is Microsoft Subsystem for UNIX-based Applications (aka SUA), which is a POSIX environment around which a development community has grown. Many utilities commonly thought of as ''Unix'' tools are available for free download. Unfortunately, Microsoft has chosen, for business reasons, to limit some of their platforms (I believe only 2 of the 7 Vista variants are able to use it) from using SUA. However, if you are using Microsoft XP, Server, or Vista Ultimate or Enterprise, you should take a look at it. The development community has a tool repository with an interface conceptually similar to CPAN or teacup. ** Mingw/MSys ** [JMN] On windows NT & windows 2000; mingw/MSys, although a little clumsy to set up and maintain, was a reliable tool for building Tcl/TK. Unfortunately, as of 2007-07, this toolchain doesn't seem to have kept up and doesn't appear to even launch properly on Vista 64bit. ---- In [https://groups.google.com/d/msg/comp.lang.tcl/XG2boNVKIrQ/40po9wXv_aYJ%|%Compiling with mingw (WAS: Re: Problem with threads.], [comp.lang.tcl], 2002-05-28, [Steve Blinkhorn], praised the Mingw C compiler ([mingwin]) 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.'']] ** Cygwin ** 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. [GPS] Tcl/Tk 8.4.1 and the CVS HEAD as of Jan/27/2003 compile with Cygwin for me. I've found that I can do a MinGW (using Cygwin's MinGW package) build while in Cygwin's XFree86 if after I run ./configure I edit the Makefile and add -mno-cygwin after gcc. I've even built some simple extensions using it. Are there environments similar to [Cygwin] for Windows that allow one to compile Unix applications on Windows? For instance, I've heard references to [David Korn]'s UWin . [LV]: Besides UWin, there is Interix, aka SFU aka SUA I think now. This is a package that Microsoft makes available for free download now for Windows XP and Windows Server, and which they are incorporating into future releases. I suspect there are more. [TV]: Cygwin IS capable of compiling serious unix applications to windows, and it is freely downloadable and since some time now comes with a easy to use installer app. Also, you can select to automatically install XFree86, ax xserver for direct and parallel use under windows, which can even accomodate KDE on windows, which worked, but I must fix mine after a cygwin upgrade. The xserver works networked, too, for instance if you want to access a linux machine on windows, you can adjust you DISPLAY variable to have windows on the other machine cross the net, which is good to develop multiple platform. I did do a tcl/tk build under cygwin some time ago, I guess 8.0 or so, which I could complete with some minor warnings/errors (closing stdout or something stupid) with some work, though. If anyone did recently with success before I might throw in some time, I'd like to know. ** Borland C Compiler ** 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 [http://groups.google.com/groups?threadm=3d459689.2875662%40News.CIS.DFN.DE], in which Helmut volunteers info on using Borland compiler to build Tcl. In summer 2003, Helmut is working to make 8.5 generate correctly for Borland "out of the box". ** lcc ** Also of potential interest are the [http://www.cs.virginia.edu/~lcc-win32/%|%lcc-win32] [http://www.cs.princeton.edu/software/lcc/%|%lcc] compilers. ** Cross-Compiling for Windows ** Another commonly discussed technique is using a Linux machine and cross compiling to generate Windows binaries. [[Someone have some URLs or wiki references here?]] See [cross-compiling] for a cook book for that. 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 ** Packers ** [http://linux20368.dn.net/protools/packers.htm] describes a variety of products of interest to those involved in application-level [obfuscation], compression, and so on. <> Category Porting | Category Windows