diff options
Diffstat (limited to 'pthreads/README')
-rw-r--r-- | pthreads/README | 477 |
1 files changed, 252 insertions, 225 deletions
diff --git a/pthreads/README b/pthreads/README index 545360bfa..9e9bb8103 100644 --- a/pthreads/README +++ b/pthreads/README @@ -10,15 +10,14 @@ specific to pthreads-win32, copyrights and the LGPL. What is it? ----------- -Pthreads-win32 is an Open Source Software implementation of the -Threads component of the POSIX 1003.1c 1995 Standard (or later) -for Microsoft's Win32 environment. Some functions from POSIX -1003.1b are also supported including semaphores. Other related -functions include the set of read-write lock functions. The +Pthreads-win32 (a.k.a. pthreads4w) is an Open Source Software +implementation of the Threads component of the POSIX 1003.1c 1995 +Standard (or later) for Microsoft's Windows environment. Some functions +from POSIX 1003.1b are also supported, including semaphores. Other +related functions include the set of read-write lock functions. The library also supports some of the functionality of the Open -Group's Single Unix specification, version 2, namely mutex types, -plus some common and pthreads-win32 specific non-portable -routines (see README.NONPORTABLE). +Group's Single Unix specification, namely mutex types, plus some common +and pthreads-win32 specific non-portable routines (see README.NONPORTABLE). See the file "ANNOUNCE" for more information including standards conformance details and the list of supported and unsupported @@ -27,15 +26,15 @@ routines. Prerequisites ------------- -MSVC or GNU C (MinGW32 MSys development kit) +MSVC or GNU C (MinGW32 or MinGW64 MSys development kit) To build from source. QueueUserAPCEx by Panagiotis E. Hadjidoukas - To support any thread cancelation in C++ library builds or - to support cancelation of blocked threads in any build. + To support any thread cancellation in C++ library builds or + to support cancellation of blocked threads in any build. This library is not required otherwise. - For true async cancelation of threads (including blocked threads). + For true async cancellation of threads (including blocked threads). This is a DLL and Windows driver that provides pre-emptive APC by forcing threads into an alertable state when the APC is queued. Both the DLL and driver are provided with the pthreads-win32.exe @@ -47,7 +46,7 @@ QueueUserAPCEx by Panagiotis E. Hadjidoukas Pthreads-win32 will automatically detect if the QueueUserAPCEx DLL QuserEx.DLL is available and whether the driver AlertDrv.sys is loaded. If it is not available, pthreads-win32 will simulate async - cancelation, which means that it can async cancel only threads that + cancellation, which means that it can async cancel only threads that are runnable. The simulated async cancellation cannot cancel blocked threads. @@ -64,6 +63,11 @@ handling schemes and compilers - and because the library may not work reliably if these are mixed in an application, each different version of the library has it's own name. +Please do not distribute your own modified versions of the library +using names conforming to this description. You can use the +makefile variable "EXTRAVERSION" to append your own suffix to the +library names when building and testing your library. + Note 1: the incompatibility is really between EH implementations of the different compilers. It should be possible to use the standard C version from either compiler with C++ applications @@ -82,80 +86,85 @@ version (it should be arbitrary) as pthread.dll, including pthread.lib and libpthread.a as appropriate. This is no longer likely to happen. -Note 4: the compatibility number was added so that applications -can differentiate between binary incompatible versions of the -libs and dlls. +Note 4: the compatibility number (major version number) was +added so that applications can differentiate between binary +incompatible versions of the libs and dlls. -In general: - pthread[VG]{SE,CE,C}[c].dll - pthread[VG]{SE,CE,C}[c].lib +In general the naming format used is: + pthread[VG]{SE,CE,C}[c][E].dll + pthread[VG]{SE,CE,C}[c][E].lib where: - [VG] indicates the compiler - V - MS VC, or - G - GNU C + [VG] indicates the compiler + V - MS VC, or + G - GNU C - {SE,CE,C} indicates the exception handling scheme - SE - Structured EH, or - CE - C++ EH, or - C - no exceptions - uses setjmp/longjmp + {SE,CE,C} indicates the exception handling scheme + SE - Structured EH, or + CE - C++ EH, or + C - no exceptions - uses setjmp/longjmp - c - DLL compatibility number indicating ABI and API - compatibility with applications built against - a snapshot with the same compatibility number. - See 'Version numbering' below. + c - DLL major version number indicating ABI + compatibility with applications built against + a snapshot with the same major version number. + See 'Version numbering' below. + E - EXTRAVERSION suffix. The name may also be suffixed by a 'd' to indicate a debugging version -of the library. E.g. pthreadVC2d.lib. Debugging versions contain -additional information for debugging (symbols etc) and are often not -optimised in any way (compiled with optimisation turned off). +of the library. E.g. pthreadVC2d.lib. These will be created e.g. when +the *-debug makefile targets are used. Examples: - pthreadVSE.dll (MSVC/SEH) - pthreadGCE.dll (GNUC/C++ EH) - pthreadGC.dll (GNUC/not dependent on exceptions) - pthreadVC1.dll (MSVC/not dependent on exceptions - not binary - compatible with pthreadVC.dll) - pthreadVC2.dll (MSVC/not dependent on exceptions - not binary - compatible with pthreadVC1.dll or pthreadVC.dll) + pthreadVC2.dll (MSVC/not dependent on exceptions - not binary + compatible with pthreadVC1.dll or pthreadVC.dll) + pthreadGC2-w32.dll (As built, e.g., by "make GC ARCH=-m32 EXTRAVERSION=-w32") + pthreadVC2-w64.dll (As built, e.g., by "nmake VC ARCH=-m64 EXTRAVERSION=-w64") -The GNU library archive file names have correspondingly changed to: +For information on ARCH (MinGW GNUmakefile) or TARGET_CPU (MSVS Makefile) +see the respective "Building with ..." sections below. - libpthreadGCEc.a - libpthreadGCc.a +The GNU library archive file names have correspondingly changed, e.g.: + libpthreadGCE2.a + libpthreadGC2.a + libpthreadGC2-w64.a -Versioning numbering --------------------- -Version numbering is separate from the snapshot dating system, and -is the canonical version identification system embedded within the -DLL using the Microsoft version resource system. The versioning -system chosen follows the GNU Libtool system. See -http://www.gnu.org/software/libtool/manual.html section 6.2. +Version numbering +----------------- -See the resource file 'version.rc'. +See pthread.h and the resource file 'version.rc'. Microsoft version numbers use 4 integers: 0.0.0.0 -Pthreads-win32 uses the first 3 following the Libtool convention. +Pthreads-win32 uses the first 3 following the standard major.minor.micro +system. We had claimed to follow the Libtool convention but this has +not been the case with recent releases. Binary compatibility and +consequently library file naming has not changed over this time either +so it should not cause any problems. + The fourth is commonly used for the build number, but will be reserved for future use. - current.revision.age.0 + major.minor.micro.0 The numbers are changed as follows: -1. If the library source code has changed at all since the last update, - then increment revision (`c:r:a' becomes `c:r+1:a'). -2. If any interfaces have been added, removed, or changed since the last - update, increment current, and set revision to 0. -3. If any interfaces have been added since the last public release, then - increment age. -4. If any interfaces have been removed or changed since the last public - release, then set age to 0. +1. If the general binary interface (ABI) has changed at all since the + last update in a way that requires recompilation and relinking of + applications, then increment Major, and set both minor and micro to 0. + (`M:m:u' becomes `M+1:0:0') +2. If the general API has changed at all since the last update or + there have been semantic/behaviour changes (bug fixes etc) but does + not require recompilation of existing applications, then increment + minor and set micro to 0. + (`M:m:u' becomes `M:m+1:0') +3. If there have been no interface or semantic changes since the last + public release but a new release is deemed necessary for some reason, + then increment micro. + (`M:m:u' becomes `M:m:u+1') DLL compatibility numbering is an attempt to ensure that applications @@ -167,13 +176,10 @@ this inevitably requires incompatible versions of the same DLLs to have different names. Pthreads-win32 has adopted the Cygwin convention of appending a single -integer number to the DLL name. The number used is based on the library -version number and is computed as 'current' - 'age'. - -(See http://home.att.net/~perlspinr/libversioning.html for a nicely -detailed explanation.) +integer number to the DLL name. The number used is simply the library's +major version number. -Using this method, DLL name/s will only change when the DLL's +Consequently, DLL name/s will only change when the DLL's backwards compatibility changes. Note that the addition of new 'interfaces' will not of itself change the DLL's compatibility for older applications. @@ -186,51 +192,18 @@ or, What are all these pthread*.dll and pthread*.lib files? ------------------------------------------------------- -Simple, use either pthreadGCv.* if you use GCC, or pthreadVCv.* if you -use MSVC - where 'v' is the DLL versioning (compatibility) number. +Simple, use either pthreadGCc.* if you use GCC, or pthreadVCc.* if you +use MSVC - where 'c' is the DLL versioning (compatibility) number. Otherwise, you need to choose carefully and know WHY. The most important choice you need to make is whether to use a version that uses exceptions internally, or not. There are versions of the library that use exceptions as part of the thread -cancelation and exit implementation. The default version uses +cancellation and exit implementation. The default version uses setjmp/longjmp. -There is some contension amongst POSIX threads experts as -to how POSIX threads cancelation and exit should work -with languages that use exceptions, e.g. C++ and even C -(Microsoft's Structured Exceptions). - -The issue is: should cancelation of a thread in, say, -a C++ application cause object destructors and C++ exception -handlers to be invoked as the stack unwinds during thread -exit, or not? - -There seems to be more opinion in favour of using the -standard C version of the library (no EH) with C++ applications -for the reason that this appears to be the assumption commercial -pthreads implementations make. Therefore, if you use an EH version -of pthreads-win32 then you may be under the illusion that -your application will be portable, when in fact it is likely to -behave differently when linked with other pthreads libraries. - -Now you may be asking: then why have you kept the EH versions of -the library? - -There are a couple of reasons: -- there is division amongst the experts and so the code may - be needed in the future. Yes, it's in the repository and we - can get it out anytime in the future, but it would be difficult - to find. -- pthreads-win32 is one of the few implementations, and possibly - the only freely available one, that has EH versions. It may be - useful to people who want to play with or study application - behaviour under these conditions. - -Notes: - -[If you use either pthreadVCE or pthreadGCE] +If you use either pthreadVCE or pthreadGCE: 1. [See also the discussion in the FAQ file - Q2, Q4, and Q5] @@ -248,13 +221,9 @@ threads then you will need to replace the "catch(...)" with the macro } #endif -Otherwise neither pthreads cancelation nor pthread_exit() will work +Otherwise neither pthreads cancellation nor pthread_exit() will work reliably when using versions of the library that use C++ exceptions -for cancelation and thread exit. - -This is due to what is believed to be a C++ compliance error in VC++ -whereby you may not have multiple handlers for the same exception in -the same try/catch block. GNU G++ doesn't have this restriction. +for cancellation and thread exit. Other name changes @@ -285,7 +254,7 @@ from the compiler used, and one of the following was defined accordingly: __CLEANUP_C C, including GNU GCC, not MSVC These defines determine the style of cleanup (see pthread.h) and, -most importantly, the way that cancelation and thread exit (via +most importantly, the way that cancellation and thread exit (via pthread_exit) is performed (see the routine ptw32_throw()). In short, the exceptions versions of the library throw an exception @@ -297,7 +266,7 @@ is when it's canceled or exits via pthread_exit(). In this snapshot, unless the build explicitly defines (e.g. via a compiler option) __CLEANUP_SEH, __CLEANUP_CXX, or __CLEANUP_C, then the build NOW always defaults to __CLEANUP_C style cleanup. This style -uses setjmp/longjmp in the cancelation and pthread_exit implementations, +uses setjmp/longjmp in the cancellation and pthread_exit implementations, and therefore won't do stack unwinding even when linked to applications that have it (e.g. C++ apps). This is for consistency with most/all commercial Unix POSIX threads implementations. @@ -329,104 +298,185 @@ now run or crash in similar ways irrespective of the pthreads platform you use. Or at least this is the hope. -Building under VC++ using C++ EH, Structured EH, or just C ----------------------------------------------------------- +Development Build Toolchains and Configurations +----------------------------------------------- + +As of Release 2.10 all build configurations pass the full test suite +for the following toolchains and configurations: + +DLL and static library (full inlined and small) builds: +VC, VCE, VSE +GC, GCE + +MSVS: +Intel Core i7 (6 Core HT) +Windows 7 64 bit +MSVS 2010 Express with SDK 7.1 (using the SDK command shell) +TARGET_CPU = x64 and x86 + +GNU: +Intel Core i7 (6 Core HT) +Windows 7 64 bit +MinGW64 multilib enabled +ARCH = -m32 and -m64 + + +Building with MS Visual Studio (C, VC++ using C++ EH, or Structured EH) +----------------------------------------------------------------------- From the source directory run nmake without any arguments to list help information. E.g. $ nmake -Microsoft (R) Program Maintenance Utility Version 6.00.8168.0 -Copyright (C) Microsoft Corp 1988-1998. All rights reserved. +As examples, as at Release 2.10 the pre-built DLLs and static libraries +are built from the following command-lines: + +[Note: "setenv" comes with the SDK. "/2003" is used to override my build +system which is Win7 (at the time of writing) for backwards compatibility.] + +$ setenv /x64 /2003 /Release +$ nmake realclean VC +$ nmake realclean VCE +$ nmake realclean VSE +$ nmake realclean VC-static +$ nmake realclean VCE-static +$ nmake realclean VSE-static +$ setenv /x86 /2003 /Release +$ nmake realclean VC +$ nmake realclean VCE +$ nmake realclean VSE +$ nmake realclean VC-static +$ nmake realclean VCE-static +$ nmake realclean VSE-static -Run one of the following command lines: -nmake clean VCE (to build the MSVC dll with C++ exception handling) -nmake clean VSE (to build the MSVC dll with structured exception handling) -nmake clean VC (to build the MSVC dll with C cleanup code) -nmake clean VCE-inlined (to build the MSVC inlined dll with C++ exception handling) -nmake clean VSE-inlined (to build the MSVC inlined dll with structured exception handling) -nmake clean VC-inlined (to build the MSVC inlined dll with C cleanup code) -nmake clean VC-static (to build the MSVC static lib with C cleanup code) -nmake clean VCE-debug (to build the debug MSVC dll with C++ exception handling) -nmake clean VSE-debug (to build the debug MSVC dll with structured exception handling) -nmake clean VC-debug (to build the debug MSVC dll with C cleanup code) -nmake clean VCE-inlined-debug (to build the debug MSVC inlined dll with C++ exception handling) -nmake clean VSE-inlined-debug (to build the debug MSVC inlined dll with structured exception handling) -nmake clean VC-inlined-debug (to build the debug MSVC inlined dll with C cleanup code) -nmake clean VC-static-debug (to build the debug MSVC static lib with C cleanup code) +If you want to differentiate between libraries by their names you can use, +e.g.: +$ nmake realclean VC EXTRAVERSION="-w64" -The pre-built dlls are normally built using the *-inlined targets. +The string provided via the variable EXTRAVERSION is appended to the dll +and .lib library names, e.g.: + +pthreadVC2-w64.dll +pthreadVC2-w64.lib + +To build and test all DLLs and static lib compatibility versions +(VC, VCE, VSE): + +[Note that the EXTRAVERSION="..." option is passed to the tests Makefile +when you target "all-tests". If you change to the tests directory and +run the tests you will need to repeat the option explicitly to the test +"nmake" command-line.] + +$ setenv /x64 /2003 /release +$ nmake all-tests You can run the testsuite by changing to the "tests" directory and running nmake. E.g.: $ cd tests -$ nmake +$ nmake VC + +For failure analysis etc. individual tests can be built +and run, e.g: -Microsoft (R) Program Maintenance Utility Version 6.00.8168.0 -Copyright (C) Microsoft Corp 1988-1998. All rights reserved. +$ cd tests +$ nmake VC TESTS="foo bar" + +This builds and runs all prerequisite tests as well as the individual +tests listed. Prerequisite tests are defined in tests\runorder.mk. + +To build and run only those tests listed use, i.e. without the +additional prerequistite dependency tests: -Run one of the following command lines: -nmake clean VC (to test using VC dll with VC (no EH) applications) -nmake clean VCX (to test using VC dll with VC++ (EH) applications) -nmake clean VCE (to test using the VCE dll with VC++ EH applications) -nmake clean VSE (to test using VSE dll with VC (SEH) applications) -nmake clean VC-bench (to benchtest using VC dll with C bench app) -nmake clean VCX-bench (to benchtest using VC dll with C++ bench app) -nmake clean VCE-bench (to benchtest using VCE dll with C++ bench app) -nmake clean VSE-bench (to benchtest using VSE dll with SEH bench app) -nmake clean VC-static (to test using VC static lib with VC (no EH) applications) +$ cd tests +$ nmake VC NO_DEPS=1 TESTS="foo bar" -Building under Mingw32 ----------------------- +Building with MinGW +------------------- -The dll can be built easily with recent versions of Mingw32. -(The distributed versions are built using Mingw32 and MsysDTK -from www.mingw32.org.) +Please use Mingw64 to build either 64 or 32 bit variants of the DLL that will +run on 64 bit systems. We have found that Mingw32 builds of the GCE library +variants fail when run on 64 bit systems. -From the source directory, run make for help information. E.g.: +From the source directory, run 'make' without arguments for help information. $ make -Run one of the following command lines: -make clean GC (to build the GNU C dll with C cleanup code) -make clean GCE (to build the GNU C dll with C++ exception handling) -make clean GC-inlined (to build the GNU C inlined dll with C cleanup code) -make clean GCE-inlined (to build the GNU C inlined dll with C++ exception handling) -make clean GC-static (to build the GNU C inlined static lib with C cleanup code) -make clean GC-debug (to build the GNU C debug dll with C cleanup code) -make clean GCE-debug (to build the GNU C debug dll with C++ exception handling) -make clean GC-inlined-debug (to build the GNU C inlined debug dll with C cleanup code) -make clean GCE-inlined-debug (to build the GNU C inlined debug dll with C++ exception handling) -make clean GC-static-debug (to build the GNU C inlined static debug lib with C cleanup code) +With MinGW64 multilib installed the following variables can be defined +either on the make command line or in the shell environment: + +ARCH + - possible values are "-m64" and "-m32". You will probably recognise + these as gcc flags however the GNUmakefile also converts these into + the appropriate windres options when building version.o. + +As examples, as at Release 2.10 the pre-built DLLs and static libraries +are built from the following command-lines: -The pre-built dlls are normally built using the *-inlined targets. +$ nmake realclean GC ARCH=-m64 +$ nmake realclean GC ARCH=-m32 +$ nmake realclean GCE ARCH=-m64 +$ nmake realclean GCE ARCH=-m32 +$ nmake realclean GC-static ARCH=-m64 +$ nmake realclean GC-static ARCH=-m32 +$ nmake realclean GCE-static ARCH=-m64 +$ nmake realclean GCE-static ARCH=-m32 + +If you want to differentiate between libraries by their names you can use, +e.g.: + +$ make realclean GC ARCH="-m64" EXTRAVERSION="-w64" + +The string provided via the variable EXTRAVERSION is appended to the dll +and .a library names, e.g.: + +pthreadGC2-w64.dll +libpthreadGC2-w64.a + +To build and test all DLLs and static lib compatibility variants (GC, GCE): + +Note that the ARCH="..." and/or EXTRAVERSION="..." options are passed to the +tests GNUmakefile when you target "all-tests". If you change to the tests +directory and run the tests you will need to repeat those options explicitly +to the test "make" command-line. + +$ make all-tests +or, with MinGW64 (multilib enabled): +$ make all-tests ARCH=-m64 +$ make all-tests ARCH=-m32 You can run the testsuite by changing to the "tests" directory and -running make for help information. E.g.: +running make. E.g.: $ cd tests -$ make -Run one of the following command lines: -make clean GC (to test using GC dll with C (no EH) applications) -make clean GCX (to test using GC dll with C++ (EH) applications) -make clean GCE (to test using GCE dll with C++ (EH) applications) -make clean GC-bench (to benchtest using GNU C dll with C cleanup code) -make clean GCE-bench (to benchtest using GNU C dll with C++ exception handling) -make clean GC-static (to test using GC static lib with C (no EH) applications) +$ make GC + +For failure analysis etc. individual tests can be built and run, e.g: +$ cd tests +$ make GC TESTS="foo bar" + +This builds and runs all prerequisite tests as well as the individual +tests listed. Prerequisite tests are defined in tests\runorder.mk. -Building under Linux using the Mingw32 cross development tools --------------------------------------------------------------- +To build and run only those tests listed use, i.e. without the additional +prerequistite dependency tests: -You can build the library without leaving Linux by using the Mingw32 cross -development toolchain. See http://www.libsdl.org/extras/win32/cross/ for -tools and info. The GNUmakefile contains some support for this, for example: +$ cd tests +$ make GC NO_DEPS=1 TESTS="foo bar" -make CROSS=i386-mingw32msvc- clean GC-inlined + +Building under Linux using the MinGW cross development tools +------------------------------------------------------------ + +You can build the library on Linux by using the MinGW cross development +toolchain. See http://www.libsdl.org/extras/win32/cross/ for tools and +info. The GNUmakefile contains some support for this, for example: + +make CROSS=i386-mingw32msvc- clean GC will build pthreadGCn.dll and libpthreadGCn.a (n=version#), provided your cross-tools/bin directory is in your PATH (or use the cross-make.sh script @@ -449,30 +499,12 @@ MinGW32 (creates libpthreadGCn.a as a static link lib): make clean GC-static - -Define PTW32_STATIC_LIB when building your application. Also, your -application must call a two non-portable routines to initialise the -some state on startup and cleanup before exit. One other routine needs -to be called to cleanup after any Win32 threads have called POSIX API -routines. See README.NONPORTABLE or the html reference manual pages for -details on these routines: - -BOOL pthread_win32_process_attach_np (void); -BOOL pthread_win32_process_detach_np (void); -BOOL pthread_win32_thread_attach_np (void); // Currently a no-op -BOOL pthread_win32_thread_detach_np (void); - - -The tests makefiles have the same targets but only check that the -static library is statically linkable. They don't run the full -testsuite. To run the full testsuite, build the dlls and run the -dll test targets. - +Define PTW32_STATIC_LIB also when building your application. Building the library under Cygwin --------------------------------- -Cygwin is implementing it's own POSIX threads routines and these +Cygwin implements it's own POSIX threads routines and these will be the ones to use if you develop using Cygwin. @@ -485,39 +517,34 @@ from the FTP site (see under "Availability" below): pthread.h semaphore.h sched.h - pthreadVC.dll - built with MSVC compiler using C setjmp/longjmp - pthreadVC.lib - pthreadVCE.dll - built with MSVC++ compiler using C++ EH - pthreadVCE.lib - pthreadVSE.dll - built with MSVC compiler using SEH - pthreadVSE.lib - pthreadGC.dll - built with Mingw32 GCC - libpthreadGC.a - derived from pthreadGC.dll - pthreadGCE.dll - built with Mingw32 G++ - libpthreadGCE.a - derived from pthreadGCE.dll - -As of August 2003 pthreads-win32 pthreadG* versions are built and tested -using the MinGW + MsysDTK environment current as of that date or later. -The following file MAY be needed for older MinGW environments. - - gcc.dll - needed to build and run applications that use - pthreadGCE.dll. - + pthreadVC2.dll - built with MSVC compiler using C setjmp/longjmp + pthreadVC2.lib + pthreadVCE2.dll - built with MSVC++ compiler using C++ EH + pthreadVCE2.lib + pthreadVSE2.dll - built with MSVC compiler using SEH + pthreadVSE2.lib + pthreadGC2.dll - built with Mingw32 GCC + libpthreadGC2.a - derived from pthreadGC.dll + pthreadGCE2.dll - built with Mingw32 G++ + libpthreadGCE2.a - derived from pthreadGCE.dll + +You may also need to include runtime DLLs from your SDK when +distributing your applications. Building applications with GNU compilers ---------------------------------------- -If you're using pthreadGC.dll: +If you're using pthreadGC2.dll: -With the three header files, pthreadGC.dll and libpthreadGC.a in the +With the three header files, pthreadGC2.dll and libpthreadGC2.a in the same directory as your application myapp.c, you could compile, link -and run myapp.c under Mingw32 as follows: +and run myapp.c under MinGW as follows: - gcc -o myapp.exe myapp.c -I. -L. -lpthreadGC + gcc -o myapp.exe myapp.c -I. -L. -lpthreadGC2 myapp -Or put pthreadGC.dll in an appropriate directory in your PATH, -put libpthreadGC.a in your system lib directory, and +Or put pthreadGC2.dll in an appropriate directory in your PATH, +put libpthreadGC2.a in your system lib directory, and put the three header files in your system include directory, then use: @@ -525,13 +552,13 @@ then use: myapp -If you're using pthreadGCE.dll: +If you're using pthreadGCE2.dll: -With the three header files, pthreadGCE.dll, gcc.dll and libpthreadGCE.a +With the three header files, pthreadGCE2.dll and libpthreadGCE2.a in the same directory as your application myapp.c, you could compile, link and run myapp.c under Mingw32 as follows: - gcc -x c++ -o myapp.exe myapp.c -I. -L. -lpthreadGCE + gcc -x c++ -o myapp.exe myapp.c -I. -L. -lpthreadGCE2 myapp Or put pthreadGCE.dll and gcc.dll in an appropriate directory in |