1 <chapter id="winelib-toolkit">
2 <title id="winelib-toolkit.title">The Winelib development toolkit</title>
5 <title id="winemaker.title">Winemaker</title>
7 <sect2 id="vc-projects">
8 <title id="vc-projects.title">Support for Visual C++ projects</title>
10 Unfortunately Winemaker does not support the Visual C++ project
11 files, ...yet. Supporting Visual C++ project files (the
12 <filename>.dsp</filename> and some <filename>.mak</filename> files
13 for older versions of Visual C++) is definitely on
14 the list of important Winemaker improvements as it will allow it to
15 properly detect the defines to be used, any custom include path, the
16 list of libraries to link with, and exactly which source files to use
17 to build a specific target. All things that the current version of
18 Winemaker has to guess or that you have to tell it as will become
19 clear in the next section.
22 When the time comes Winemaker, and its associated build system, will
23 need some extensions to support:
28 per file defines and include paths. Visual C++ projects allow
29 the user to specify compiler options for each individual file
30 being compiled. But this is probably not very frequent so it
31 might not be that important.
36 multiple configurations. Visual C++ projects usually have at
37 least a 'Debug' and a 'Release' configuration which are compiled
38 with different compiler options. How exactly we deal with these
39 configurations remains to be determined.
45 <sect2 id="source-analysis">
46 <title id="source-analysis.title">Winemaker's source analysis</title>
48 Winemaker can do its work even without a Windows makefile or a
49 Visual Studio project to start from (it would not know what to do
50 with a windows makefile anyway). This involves doing many educated
51 guesses which may be wrong. But by and large it works. The purpose
52 of this section is to describe in more details how winemaker
53 proceeds so that you can better understand why it gets things
54 wrong and how to fix it/avoid it.
57 At the core winemaker does a recursive traversal of
58 your source tree looking for targets (things to build) and source
59 files. Let's start with the targets.
62 First are executables and dlls. Each time it finds one of these in
63 a directory, winemaker puts it in the list of things to build and
64 will later generate a <filename>Makefile.in</filename> file in this
65 directory. Note that Winemaker also knows about the commonly used
66 <filename>Release</filename> and <filename>Debug</filename>
67 directories, so it will attribute the executables and libraries
68 found in these to their parent directory. When it finds an
69 executable or a dll winemaker is happy because these give it more
70 information than the other cases described below.
73 If it does not find any executable or dll winemaker will look for
74 files with a <filename>.mak</filename> extension. If they are not
75 disguised Visual C++ projects (and currently even if they are),
76 winemaker will assume that a target by that name should be built
77 in this directory. But it will not know whether this target is an
78 executable or a library. So it will assume it is of the default
79 type, i.e. a graphical application, which you can override by using
80 the <option>--cuiexe</option> and <option>--dll</option> options.
83 Finally winemaker will check to see if there is a file called
84 <filename>makefile</filename>. If there is, then it will assume
85 that there is exactly one target to build for this directory. But
86 it will not know the name or type of this target. For the type it
87 will do as in the above case. And for the name it will use the
88 directory's name. Actually, if the directory starts with
89 <filename>src</filename> winemaker will try to make use of the name
90 of the parent directory instead.
93 Once the target list for a directory has been established,
94 winemaker will check whether it contains a mix of executables and
95 libraries. If it is so, then winemaker will make it so that each
96 executable is linked with all the libraries of that directory.
99 If the previous two steps don't produce the expected results (or
100 you think they will not) then you should put winemaker in
101 interactive mode (see <xref linkend="interactive"
102 endterm="interactive.title">). This will allow you to specify the
103 target list (and more) for each directory.
106 In each directory winemaker also looks for source files: C, C++
107 or resource files. If it also found targets to build in this
108 directory it will then try to assign each source file to one of
109 these targets based on their names. Source files that do not seem
110 to match any specific target are put in a global list for this
111 directory, see the <literal>EXTRA_xxx</literal> variables in the
112 <filename>Makefile.in</filename>, and linked with each of the
113 targets. The assumption here is that these source files contain
114 common code which is shared by all the targets.
115 If no targets were found in the directory where these files are
116 located, then they are assigned to the parent's directory. So if a
117 target is found in the parent directory it will also 'inherit' the
118 source files found in its subdirectories.
121 Finally winemaker also looks for more exotic files like
122 <filename>.h</filename> headers, <filename>.inl</filename> files
123 containing inline functions and a few others. These are not put in
124 the regular source file lists since they are not compiled directly.
125 But winemaker will still remember them so that they are processed
126 when the time comes to fix the source files.
129 Fixing the source files is done as soon as winemaker has finished
130 its recursive directory traversal. The two main tasks in this step
131 are fixing the CRLF issues and verifying the case of the include
135 Winemaker makes a backup of each source file (in such a way that
136 symbolic links are preserved), then reads it fixing the CRLF
137 issues and the other issues as it goes. Once it has finished
138 working on a file it checks whether it has done any non
139 CRLF-related modification and deletes the backup file if it did
140 not (or if you used <option>--nobackup</option>).
143 Checking the case of the include statements (of any form,
144 including files referenced by resource files), is done in the
145 context of that source file's project. This way winemaker can use
146 the proper include path when looking for the file that is included.
147 If winemaker fails to find a file in any of the directories of the
148 include path, it will rename it to lowercase on the basis that it
149 is most likely a system header and that all system headers names
150 are lowercase (this can be overriden by using
151 <option>--nolower-include</option>).
154 Finally winemaker generates the <filename>Makefile.in</filename>
155 files and other support files (wrapper files, spec files,
156 <filename>configure.in</filename>,
157 <filename>Make.rules.in</filename>). From the above description
158 you can guess at the items that winemaker may get wrong in
159 this phase: macro definitions, include path, library path,
160 list of libraries to import. You can deal with these issues by
161 using winemaker's <option>-D</option>, <option>-I</option>,
162 <option>-L</option> and <option>-i</option> options if they are
163 homogeneous enough between all your targets. Otherwise you may
164 want to use winemaker's <link linkend="interactive">interactive
165 mode</link> so that you can specify different settings for each
169 For instance, one of the problems you are likely to encounter is
170 that of the <varname>STRICT</varname> macro. Some programs will
171 not compile if <varname>STRICT</varname> is not turned on, and
172 others will not compile if it is. Fortunately all the files in a
173 given source tree use the same setting so that all you have to do
174 is add <literal>-DSTRICT</literal> on winemaker's command line
175 or in the <filename>Makefile.in</filename> file(s).
178 Finally the most likely reasons for missing or duplicate symbols
184 The target is not being linked with the right set of libraries.
185 You can avoid this by using winemaker's <option>-L</option> and
186 <option>-i</option> options or adding these libraries to the
187 <filename>Makefile.in</filename> file.
192 Maybe you have multiple targets in a single directory and
193 winemaker guessed wrong when trying to match the source files
194 with the targets. The only way to fix this kind of problem is
195 to edit the <filename>Makefile.in</filename> file manually.
200 Winemaker assumes you have organized your source files
201 hierarchically. If a target uses source files that are in a
202 sibling directory, e.g. if you link with
203 <filename>../hello/world.o</filename> then you will get missing
204 symbols. Again the only solution is to manually edit the
205 <filename>Makefile.in</filename> file.
211 <sect2 id="interactive">
212 <title id="interactive.title">The interactive mode</title>
220 <sect2 id="Makefile.in">
221 <title id="Makefile.in.title">The Makefile.in files</title>
223 The <filename>Makefile.in</filename> is your makefile. More
224 precisely it is the template from which the actual makefile will
225 be generated by the <filename>configure</filename> script. It also
226 relies on the <filename>Make.rules</filename> file for most of
227 the actual logic. This way it only contains a relatively simple
228 description of what needs to be built, not the complex logic of
229 how things are actually built.
232 So this is the file to modify if you want to customize things.
233 Here's a detailed description of its content:
236 ### Generic autoconf variables
238 TOPSRCDIR = @top_srcdir@
244 The above is part of the standard autoconf boiler-plate. These
245 variables make it possible to have per-architecture directories for
246 compiled files and other similar goodies (But note that this kind
247 of functionality has not been tested with winemaker generated
248 <filename>Makefile.in</filename> files yet).
256 This is where the targets for this directory are listed. The names
257 are pretty self-explanatory. <varname>SUBDIRS</varname> is usually
258 only present in the top-level makefile. For libraries you should
259 put the full Unix name, e.g. <literal>libfoo.so</literal>.
270 This section contains the global compilation settings: they apply
271 to all the targets in this makefile. The <varname>LIBRARIES</varname>
272 variable allows you to specify additional Unix libraries to link with.
273 Note that you would normally not specify Winelib libraries there. To
274 link with a Winelib library, one uses the 'import' statement of the
275 <link linkend="spec-file">spec files</link>. The exception is when you
276 have not explicitly exported the functions of a Winelib library. One
277 library you are likely to find here is <literal>mfc</literal> (note,
278 the '-l' is omitted).
282 names should be self-explanatory. You can also use three additional
283 variables that are usually not present in the file:
284 <varname>CEXTRA</varname>, <varname>CXXEXTRA</varname> and
285 <varname>WRCEXTRA</varname> which allow you to specify additional
286 flags for, respectively, the C compiler, the C++ compiler and the
287 resource compiler. Finally note that all these variable contain
288 the option's name except <varname>IMPORTS</varname>. So you should
289 put <literal>-DSTRICT</literal> in <varname>DEFINES</varname> but
290 <literal>winmm</literal> in <varname>IMPORTS</varname>.
293 Then come one section per target, each describing the various
294 components that target is made of.
297 ### hello sources and settings
299 hello_C_SRCS = hello.c
302 hello_SPEC_SRCS = hello.spec
305 Each section will start with a comment indicating the name of the
306 target. Then come a series of variables prefixed with the name of
307 that target. Note that the name of the prefix may be slightly
308 different from that of the target because of restrictions on the
312 The above variables list the sources that are used togenerate the
313 target. Note that there should only be one resource file in
314 <varname>RC_SRCS</varname>, and that <varname>SPEC_SRCS</varname>
315 will always contain a single spec file.
323 The above variables specify how to link the target. Note that they
324 add to the global settings we saw at the beginning of this file.
327 <varname>DEPENDS</varname>, when present, specifies a list of other
328 targets that this target depends on. Winemaker will automatically
329 fill this field, and the <varname>LIBRARIES</varname> field, when an
330 executable and a library are built in the same directory.
333 The reason why winemaker also links with libraries in the Unix sense
334 in the case above is because functions will not be properly exported.
335 Once you have exported all the functions in the library's spec file
336 you should remove them from the <varname>LIBRARIES</varname> field.
339 hello_OBJS = $(hello_C_SRCS:.c=.o) \
340 $(hello_CXX_SRCS:.cpp=.o) \
344 The above just builds a list of all the object files that
345 correspond to this target. This list is later used for the link
349 ### Global source lists
351 C_SRCS = $(hello_C_SRCS)
352 CXX_SRCS = $(hello_CXX_SRCS)
353 RC_SRCS = $(hello_RC_SRCS)
354 SPEC_SRCS = $(hello_SPEC_SRCS)
357 This section builds 'summary' lists of source files. These lists are
358 used by the <filename>Make.rules</filename> file.
361 ### Generic autoconf targets
363 all: $(DLLS) $(EXES:%=%.so)
368 for i in $(EXES); do $(INSTALL_PROGRAM) $$i $(bindir); done
369 for i in $(EXES:%=%.so) $(DLLS); do $(INSTALL_LIBRARY) $$i $(libdir); done
372 for i in $(EXES); do $(RM) $(bindir)/$$i;done
373 for i in $(EXES:%=%.so) $(DLLS); do $(RM) $(libdir)/$$i;done
376 The above first defines the default target for this makefile. Here
377 it consists in trying to build all the targets. Then it includes
378 the <filename>Make.rules</filename> file which contains the build
379 logic, and provides a few more standard targets to install /
380 uninstall the targets.
383 ### Target specific build rules
385 $(hello_SPEC_SRCS:.spec=.tmp.o): $(hello_OBJS)
386 $(LDCOMBINE) $(hello_OBJS) -o $@
387 -$(STRIP) $(STRIPFLAGS) $@
389 $(hello_SPEC_SRCS:.spec=.spec.c): $(hello_SPEC_SRCS:.spec) $(hello_SPEC_SRCS:.spec=.tmp.o) $(hello_RC_SRCS:.rc=.res)
390 $(WINEBUILD) -fPIC $(hello_LIBRARY_PATH) $(WINE_LIBRARY_PATH) -sym $(hello_SPEC_SRCS:.spec=.tmp.o) -o $@ -spec $(hello_SPEC_SRCS)
392 hello.so: $(hello_SPEC_SRCS:.spec=.spec.o) $(hello_OBJS) $(hello_DEP
394 $(LDSHARED) $(LDDLLFLAGS) -o $@ $(hello_OBJS) $(hello_SPEC_SRCS:.spec=.spec.o) $(hello_LIBRARY_PATH) $(hello_LIBRARIES:%=-l%) $(DLL_LINK) $(LIBS)
395 test -e hello || $(LN_S) $(WINE) hello
398 Then come additional directives to link the executables and
399 libraries. These are pretty much standard and you should not need
404 <sect2 id="Make.rules.in">
405 <title id="Make.rules.in.title">The Make.rules.in file</title>
407 What's in the Make.rules.in...
411 <sect2 id="configure.in">
412 <title id="configure.in.title">The configure.in file</title>
414 What's in the configure.in...
420 <title id="wrc.title">Compiling resource files: WRC</title>
422 To compile resources you should use the Wine Resource Compiler,
423 wrc for short, which produces a binary <filename>.res</filename>
424 file. This resource file is then used by winebuild when compiling
425 the spec file (see <xref linkend="spec-file"
426 endterm="spec-file.title">).
429 Again the makefiles generated by winemaker take care of this for you.
430 But if you were to write your own makefile you would put something
434 WRC=$(WINE_DIR)/tools/wrc/wrc
436 WINELIB_FLAGS = -I$(WINE_DIR)/include -DWINELIB -D_REENTRANT
442 $(WRC) $(WRCFLAGS) $(WINELIB_FLAGS) -o $@ $<
445 There are two issues you are likely to encounter with resource files.
448 The first problem is with the C library headers. WRC does not know
449 where these headers are located. So if an RC file, of a file it
450 includes, references such a header you will get a 'file not found'
451 error from wrc. Here are a few ways to deal with this:
456 The solution traditionally used by the Winelib headers is to
457 enclose the offending include statement in an
458 <literal>#ifndef RC_INVOKED</literal> statement where
459 <varname>RC_INVOKED</varname> is a macro name which is
460 automatically defined by wrc.
465 Alternately you can add one or more <option>-I</option> directive
466 to your wrc command so that it finds you system files. For
467 instance you may add <literal>-I/usr/include
468 -I/usr/lib/gcc-lib/i386-linux/2.95.2/include</literal> to cater
469 to both C and C++ headers. But this supposes that you know where
470 these header files reside which decreases the portability of your
471 makefiles to other platforms (unless you automatically detect all
472 the necessary directories in the autoconf script).
475 Or you could use the C/C++ compiler to perform the preprocessing.
476 To do so, simply modify your makefile as follows:
480 $(CC) $(CC_OPTS) -DRC_INVOKED -E -x c $< | $(WRC) -N $(WRCFLAGS) $(WINELIB_FLAGS) -o $@
483 <!-- FIXME: does this still cause problems for the line numbers? -->
487 The second problem is that the headers may contain constructs that
488 WRC fails to understand. A typical example is a function which return
489 a 'const' type. WRC expects a function to be two identifiers followed
490 by an opening parenthesis. With the const this is three identifiers
491 followed by a parenthesis and thus WRC is confused (note: WRC should
492 in fact ignore all this like the windows resource compiler does).
493 The current work-around is to enclose offending statement(s) in an
494 <literal>#ifndef RC_INVOKED</literal>.
498 Using GIF files in resources is problematic. For best results,
499 convert them to BMP and change your <filename>.res</filename>
503 If you use common controls/dialogs in your resource files, you
504 will need to add <function>#include <commctrl.h></function>
505 after the <function>#include <windows.h></function> line,
506 so that <command>wrc</command> knows the values of control
512 <title id="wmc.title">Compiling message files: WMC</title>
514 how does one use it???
518 <sect1 id="spec-file">
519 <title id="spec-file.title">The Spec file</title>
521 <sect2 id="spec-intro">
522 <title id="spec-intro.title">Introduction</title>
524 In Windows the program's life starts either when its
525 <function>main</function> is called, for console applications, or
526 when its <function>WinMain</function> is called, for windows
527 applications in the 'windows' subsystem. On Unix it is always
528 <function>main</function> that is called. Furthermore in Winelib it
529 has some special tasks to accomplish, such as initializing Winelib,
530 that a normal <function>main</function> does not have to do.
533 Furthermore windows applications and libraries contain some
534 information which are necessary to make APIs such as
535 <function>GetProcAddress</function> work. So it is necessary to
536 duplicate these data structures in the Unix world to make these
537 same APIs work with Winelib applications and libraries.
540 The spec file is there to solve the semantic gap described above.
541 It provides the <function>main</function> function that initializes
542 Winelib and calls the module's <function>WinMain</function> /
543 <function>DllMain</function>, and it contains information about
544 each API exported from a Dll so that the appropriate tables can be
548 A typical spec file will look something like this:
560 And here are the entries you will probably want to change:
567 This is the name of the Win32 module. Usually this is the
568 same as that of the application or library (but without the
569 'lib' and the '.so').
578 <literal>mode</literal> defines whether what you are
579 building is a library, <literal>dll</literal>, a console
580 application, <literal>cuiexe</literal> or a regular
581 graphical application <literal>guiexe</literal>. Then
582 <literal>init</literal> defines what is the entry point of
583 that module. For a library this is customarily set to
584 <literal>DllMain</literal>, for a console application this
585 is <literal>main</literal> and for a graphical application
586 this is <literal>WinMain</literal>.
594 Add an 'import' statement for each library that this
595 executable depends on. If you don't, these libraries will
596 not get initialized in which case they may very well not
605 This item specifies the name of the compiled resource file
606 to link with your module. If your resource file is called
607 <filename>hello.rc</filename> then the wrc compilation step
608 (see <xref linkend="wrc" endterm="wrc.title">) will generate
609 a file called <filename>hello.res</filename>. This is the
610 name you must provide here. Note that because of this you
611 cannot compile the spec file before you have compiled the
612 resource file. So you should put a rule like the following
616 hello.spec.c: hello.res
619 If your project does not have a resource file then you must
620 omit this entry altogether.
628 This entry is not shown above because it is not always
629 necessary. In fact it is only necessary to export functions
630 when you plan to dynamically load the library with
631 <function>LoadLibrary</function> and then do a
632 <function>GetProcAddress</function> on these functions.
633 This is not necessary if you just plan on linking with the
634 library and calling the functions normally. For more details
635 about this see: <xref linkend="spec-reference"
636 endterm="spec-reference.title">.
643 <sect2 id="spec-compiling">
644 <title id="spec-compiling.title">Compiling it</title>
646 Compiling a spec file is a two step process. It is first
647 converted into a C file by winebuild, and then compiled into an
648 object file using your regular C compiler. This is all taken
649 care of by the winemaker generated makefiles of course. But
650 here's what it would like if you had to do it by hand:
653 WINEBUILD=$(WINE_DIR)/tools/winebuild
655 .SUFFIXES: .spec .spec.c .spec.o
658 $(WINEBUILD) -fPIC -o $@ -spec $<
661 $(CC) -c -o $*.spec.o $<
664 Nothing really complex there. Just don't forget the
665 <literal>.SUFFIXES</literal> statement, and beware of the tab if
666 you copy this straight to your Makefile.
670 <sect2 id="spec-reference">
671 <title id="spec-reference.title">More details</title>
673 (Extracted from tools/winebuild/README)
674 <!-- FIXME: this seems to be rather outdated and sometimes even incorrect, check with the source! -->
678 Here is a more detailed description of the spec file's format.
685 Anything after a '#' will be ignored as comments.
690 type win16|win32 <--- the |'s mean it's one or the other
693 These two fields are mandatory. <literal>name</literal>
694 defines the name of your module and <literal>type</literal>
695 whether it is a Win16 or Win32 module. Note that for Winelib
696 you should only be using Win32 modules.
703 This field is optional. It gives the name of the Windows file that
704 is replaced by the builtin. <literal><name>.DLL</literal>
705 is assumed if none is given. This is important for kernel, which
706 lives in the Windows file <filename>KRNL386.EXE</filename>.
713 This field is optional and specific to Win16 modules. It defines
714 the size of the module local heap. The default is no local heap.
718 mode dll|cuiexe|guiexe
721 This field is optional. It specifies specifies whether it is the
722 spec file for a dll or the main exe. This is only valid for Win32
730 This field is optional and specific to Win32 modules. It
731 specifies a function which will be called when the dll is loaded
732 or the executable started.
739 This field can be present zero or more times.
740 Each instance names a dll that this module depends on (only for
741 Win32 modules at the present).
748 This field is optional. If present it specifies the name of the
749 .res file containing the compiled resources. See <xref
750 linkend="wrc" endterm="wrc.title"> for details on compiling a
755 ORDINAL VARTYPE EXPORTNAME (DATA [DATA [DATA [...]]])
756 2 byte Variable(-1 0xff 0 0)
759 This field can be present zero or more times.
760 Each instance defines data storage at the ordinal specified. You
761 may store items as bytes, 16-bit words, or 32-bit words.
762 <literal>ORDINAL</literal> is replaced by the ordinal number
763 corresponding to the variable. <literal>VARTYPE</literal> should
764 be <literal>byte</literal>, <literal>word</literal> or
765 <literal>long</literal> for 8, 16, or 32 bits respectively.
766 <literal>EXPORTNAME</literal> will be the name available for
767 dynamic linking. <literal>DATA</literal> can be a decimal number
768 or a hex number preceeded by "0x". The example defines the
769 variable <literal>Variable</literal> at ordinal 2 and containing
774 ORDINAL equate EXPORTNAME DATA
777 This field can be present zero or more times.
778 Each instance defines an ordinal as an absolute value.
779 <literal>ORDINAL</literal> is replaced by the ordinal number
780 corresponding to the variable. <literal>EXPORTNAME</literal> will
781 be the name available for dynamic linking.
782 <literal>DATA</literal> can be a decimal number or a hex number
787 ORDINAL FUNCTYPE EXPORTNAME([ARGTYPE [ARGTYPE [...]]]) HANDLERNAME
788 100 pascal CreateWindow(ptr ptr long s_word s_word s_word s_word
791 101 pascal GetFocus() WIN_GetFocus()
794 This field can be present zero or more times.
795 Each instance defines a function entry point. The prototype
796 defined by <literal>EXPORTNAME ([ARGTYPE [ARGTYPE [...]]])</literal>
797 specifies the name available for dynamic linking and the format
798 of the arguments. <literal>"ORDINAL</literal>" is replaced
799 by the ordinal number corresponding to the function, or
800 <literal>@</literal> for automatic ordinal allocation (Win32 only).
803 <literal>FUNCTYPE</literal> should be one of:
807 <term>pascal16</term>
808 <listitem><para>for a Win16 function returning a 16-bit value</para></listitem>
812 <listitem><para>for a Win16 function returning a 32-bit value</para></listitem>
815 <term>register</term>
816 <listitem><para>for a function using CPU register to pass arguments</para></listitem>
819 <term>interrupt</term>
820 <listitem><para>for a Win16 interrupt handler routine</para></listitem>
824 <listitem><para>for a normal Win32 function</para></listitem>
828 <listitem><para>for a Win32 function using the C calling convention</para></listitem>
832 <listitem><para>for a Win32 function taking a variable number of arguments</para></listitem>
837 <literal>ARGTYPE</literal> should be one of:
842 <listitem><para>for a 16 bit word</para></listitem>
846 <listitem><para>a 32 bit value</para></listitem>
850 <listitem><para>for a linear pointer</para></listitem>
854 <listitem><para>for a linear pointer to a null-terminated string</para></listitem>
858 <listitem><para>for a 16 bit signed word</para></listitem>
862 <listitem><para>for a segmented pointer</para></listitem>
866 <listitem><para>for a segmented pointer to a null-terminated string</para></listitem>
871 Only <literal>ptr</literal>, <literal>str</literal> and
872 <literal>long</literal> are valid for Win32 functions.
873 <literal>HANDLERNAME</literal> is the name of the actual Wine
874 function that will process the request in 32-bit mode.
877 The two examples define an entry point for the
878 <function>CreateWindow</function> and <function>GetFocus</function>
879 calls respectively. The ordinals used are just examples.
882 To declare a function using a variable number of arguments in
883 Win16, specify the function as taking no arguments. The arguments
884 are then available with CURRENT_STACK16->args. In Win32, specify
885 the function as <literal>varargs</literal> and declare it with a
886 '...' parameter in the C file. See the wsprintf* functions in
887 <filename>user.spec</filename> and
888 <filename>user32.spec</filename> for an example.
892 ORDINAL stub EXPORTNAME
895 This field can be present zero or more times.
896 Each instance defines a stub function. It makes the ordinal
897 available for dynamic linking, but will terminate execution with
898 an error message if the function is ever called.
902 ORDINAL extern EXPORTNAME SYMBOLNAME
905 This field can be present zero or more times.
906 Each instance defines an entry that simply maps to a Wine symbol
907 (variable or function); <literal>EXPORTNAME</literal> will point
908 to the symbol <literal>SYMBOLNAME</literal> that must be defined
909 in C code. This type only works with Win32.
913 ORDINAL forward EXPORTNAME SYMBOLNAME
916 This field can be present zero or more times.
917 Each instance defines an entry that is forwarded to another entry
918 point (kind of a symbolic link). <literal>EXPORTNAME</literal>
919 will forward to the entry point <literal>SYMBOLNAME</literal>
920 that must be of the form <literal>DLL.Function</literal>. This
921 type only works with Win32.
927 <title id="linking.title">Linking it all together</title>
928 <!-- FIXME: This is outdated -->
930 To link an executable you need to link together: your object files,
931 the spec file, any Windows libraries that your application depends
932 on, gdi32 for instance, and any additional library that you use. All
933 the libraries you link with should be available as '.so' libraries.
934 If one of them is available only in '.dll' form then consult
935 <xref linkend="bindlls" endterm="bindlls.title">.
938 It is also when attempting to link your executable that you will
939 discover whether you have missing symbols or not in your custom
940 libraries. On Windows when you build a library, the linker will
941 immediately tell you if a symbol it is supposed to export is
942 undefined. In Unix, and in Winelib, this is not the case. The symbol
943 will silently be marked as undefined and it is only when you try to
944 produce an executable that the linker will verify all the symbols are
948 So before declaring victory when first converting a library to
949 Winelib, you should first try to link it to an executable (but you
950 would have done that to test it anyway, right?). At this point you
951 may discover some undefined symbols that you thought were implemented
952 by the library. Then, you to the library sources and fix it. But you
953 may also discover that the missing symbols are defined in, say,
954 gdi32. This is because you did not link the said library with gdi32.
955 One way to fix it is to link this executable, and any other that also
956 uses your library, with gdi32. But it is better to go back to your
957 library's makefile and explicitly link it with gdi32.
960 As you will quickly notice, this has unfortunately not been
961 (completely) done for Winelib's own libraries. So if an application
962 must link with ole32, you will also need to link with advapi32,
963 rpcrt4 and others even if you don't use them directly. This can be
964 annoying and hopefully will be fixed soon (feel free to submit a
967 <!-- FIXME: try to give some sort of concrete example -->
971 <!-- Keep this comment at the end of the file
974 sgml-parent-document:("wine-doc.sgml" "book" "chapter" "")