  <chapter id="portability-issues">
    <title id="portability-issues.title">Portability issues</title>

    <sect1 id="unicode">
      <title id="unicode.title">Unicode</title>

      <para>
	The <literal>wchar_t</literal> type has different standard
	sizes in Unix (4 bytes) and Windows (2 bytes). You need a
        recent gcc version (2.9.7 or later) that supports the
	<parameter>-fshort-wchar</parameter> option to set the
	size of <literal>wchar_t</literal> to the one expected
	by Windows applications. 
      </para>

      <para>
        If you are using Unicode and you want to be able to use
        standard library calls (e.g. <function>wcslen</function>,
        <function>wsprintf</function>), then you must use
        the msvcrt runtime library instead of glibc. The functions in
        glibc will not work correctly with 16 bit strings.
      </para>
    </sect1>

    <sect1 id="C-library">
      <title id="C-library.title">C library</title>

      <para>
        There are 2 choices available to you regarding which C library
        to use: the native glibc C library or the msvcrt C library.
      </para>

      <para>
        Note that under Wine, the crtdll library is implemented using
        msvcrt, so there is no benefit in trying to use it.
      </para>
      <para>
        Using glibc in general has the lowest overhead, but this is
        really only important for file I/O, as many of the functions
        in msvcrt are simply resolved to glibc.
      </para>
      <para>
        To use glibc, you don't need to make changes to your
        application; it should work straight away. There are a few
        situations in which using glibc is not possible:
      </para>
      <orderedlist>
        <listitem>
          <para>
            Your application uses Win32 and C library unicode
            functions.
          </para>
        </listitem>
        <listitem>
          <para>
            Your application uses MS specific calls like
            <function>beginthread()</function>,
            <function>loadlibrary()</function>, etc.
          </para>
        </listitem>
        <listitem>
          <para>
            You rely on the precise semantics of the calls, for
            example, returning <literal>-1</literal> rather than
            non-zero. More likely, your application will rely on calls
            like <function>fopen()</function> taking a Windows path
            rather than a Unix one.
          </para>
        </listitem>
      </orderedlist>
      <para>
        In these cases you should use msvcrt to provide your C runtime
        calls.
      </para>

      <programlisting>import msvcrt.dll</programlisting>

      <para>
        to your applications <filename>.spec</filename> file. This
        will cause <command>winebuild</command> to resolve your c
        library calls to <filename>msvcrt.dll</filename>. Many simple
        calls which behave the same have been specified as
        non-importable from msvcrt; in these cases
        <command>winebuild</command> will not resolve them and the
        standard linker <command>ld</command> will link to the glibc
        version instead.
      </para>
      <para>
        In order to avoid warnings in C (and potential errors in C++)
        from not having prototypes, you may need to use a set of MS
        compatible header files. These are scheduled for inclusion
        into Wine but at the time of writing are not available. Until
        they are, you can try prototyping the functions you need, or
        just live with the warnings.
      </para>
      <para>
        If you have a set of include files (or when they are available
        in Wine), you need to use the <parameter>-isystem
        "include_path"</parameter> flag to gcc to tell it to use your
        headers in preference to the local system headers.
      </para>
      <para>
        To use option 3, add the names of any symbols that you don't
        want to use from msvcrt into your applications
        <filename>.spec</filename> file. For example, if you wanted
        the MS specific functions, but not file I/O, you could have a
        list like:
      </para>

      <programlisting>@ignore = ( fopen fclose fwrite fread fputs fgets )</programlisting>
      <para>
        Obviously, the complete list would be much longer. Remember
        too that some functions are implemented with an underscore in
        their name and <function>#define</function>d to that name in
        the MS headers. So you may need to find out the name by
        examining <filename>dlls/msvcrt/msvcrt.spec</filename> to get
        the correct name for your <function>@ignore</function> entry.
      </para>
    </sect1>

    <sect1 id="porting-compiling">
      <title id="porting-compiling.title">Compiling Problems</title>
      <para>
        If you get undefined references to Win32 API calls when
        building your application: if you have a VC++
        <filename>.dsp</filename> file, check it for all the
        <filename>.lib</filename> files it imports, and add them to
        your applications <filename>.spec</filename>
        file. <command>winebuild</command> gives you a warning for
        unused imports so you can delete the ones you don't need
        later. Failing that, just import all the DLL's you can find in
        the <filename>dlls/</filename> directory of the Wine source
        tree.
      </para>
      <para>
        If you are missing GUIDs at the link stage, add
        <parameter>-lwine_uuid</parameter> to the link line.
      </para>
      <para>
        gcc is more strict than VC++, especially when compiling
        C++. This may require you to add casts to your C++ to prevent
        overloading ambiguities between similar types (such as two
        overloads that take int and char respectively).
      </para>
      <para>
        If you come across a difference between the Windows headers
        and Wine's that breaks compilation, try asking for help on
        <email>wine-devel@winehq.org</email>.
      </para>
    </sect1>

  </chapter>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-parent-document:("winelib-user.sgml" "book" "chapter" "")
End:
-->
