|  | <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: | 
|  | --> |