Compiling Notes: Difference between revisions

From OS2World.Com Wiki
Jump to navigation Jump to search
Line 278: Line 278:
</PRE>
</PRE>


:Fix2
Change for:
<PRE>
return ((MRESULT)TRUE) ;
</PRE>


===warning: comparison between pointer and integer===
===warning: comparison between pointer and integer===

Revision as of 03:27, 1 May 2023

These are some set of light notes I took while trying to compile some old PM samples on 2023.

Environment

RPM Packages

I always confuse the RPM packages that I use to compile things with GCC. I want to use as much as open source tools available. Here it is what I install:

  • yum install git gcc make libc-devel binutils
  • watcom-wrc
  • watcom-wlink-hll


Checking the Environments

Execute %INCLUDE% and see if something shows up.

PM Code Errors/Warnings with GCC

CHAR * {aka char *}

Warning
 gcc -Wall -Zomf -c -O2 bitcat2.c -o bitcat2.obj
 bitcat2.c: In function 'main':
 bitcat2.c:36:29: warning: pointer targets in passing argument 2 of 'WinRegisterClass' differ in signedness [-Wpointer-sign]
   36 |       WinRegisterClass(hab, szClientClass, ClientWndProc, CS_SIZEREDRAW, 0);
      |                             
      |                             |
      |                             CHAR * {aka char *}
 In file included from W:/usr/include/os2.h:39,
                 from bitcat2.c:4:
 W:/usr/include/os2emx.h:6138:47: note: expected 'PCSZ' {aka 'const unsigned char *'} but argument is of type 'CHAR *' {aka 'char *'}
Fix

I replaced

static CHAR  szClientClass[] = "BitCat2";

for

unsigned char     szClientClass[] = "BitCat2";

and warnings were removed.

'WinCreateStdWindow' makes integer from pointer without a cast [-Wint-conversion]

vectfont.c:33:38: warning: passing argument 7 of 'WinCreateStdWindow' makes integer from pointer without a cast [-Wint-conversion]
   33 |                                      NULL, ID_RESOURCE, &hwndClient) ;
      |                                      ^~~~
      |                                      |
      |                                      void *
Fix

I replaced the NULL by 0

weakld: error: Unresolved symbol (UNDEF)

Error
 
weakld: error: Unresolved symbol (UNDEF) '_max'.
weakld: info: The symbol is referenced by:
    C:\dev\DEV-SAMPLES-PM-VectFont\vf00.obj
    C:\dev\DEV-SAMPLES-PM-VectFont\vf14.obj
weakld: error: Unresolved symbol (UNDEF) '_min'.
weakld: info: The symbol is referenced by:
    C:\dev\DEV-SAMPLES-PM-VectFont\vf00.obj
    C:\dev\DEV-SAMPLES-PM-VectFont\vf05.obj
    C:\dev\DEV-SAMPLES-PM-VectFont\vf14.obj
Ignoring unresolved externals reported from weak prelinker.
Warning! W1058: file ldgVmPcu.: line(35): protmode option not valid for an OS/2 EMX executable
Error! E2028: _max is an undefined reference
Error! E2028: _min is an undefined reference
file C:\dev\DEV-SAMPLES-PM-VectFont\vf00.obj(vf00.obj): undefined symbol _max
file C:\dev\DEV-SAMPLES-PM-VectFont\vf00.obj(vf00.obj): undefined symbol _min
Fix

Include to the .H file the following missing:

#ifndef max
#define max(a,b) (((a) > (b)) ? (a) : (b))
#endif
#ifndef min
#define min(a,b) (((a) < (b)) ? (a) : (b))
#endif

Seems like an old .H file that came with OS/2 used to have that declared and now is missing.

'WinSendMsg' makes pointer from integer without a cast

Warning
vectfont.c:36:18: warning: passing argument 3 of 'WinSendMsg' makes pointer from integer without a cast [-Wint-conversion]
   36 |                  WinQuerySysPointer (HWND_DESKTOP, SPTR_APPICON, FALSE),
      |                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                  |
      |                  HPOINTER {aka long unsigned int}
In file included from C:/usr/include/os2.h:39,
                 from vectfont.c:7:
C:/usr/include/os2emx.h:5819:59: note: expected 'MPARAM' {aka 'void *'} but argument is of type 'HPOINTER' {aka 'long unsigned int'}
 5819 | MRESULT APIENTRY WinSendMsg (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
      |                                                    ~~~~~~~^~~
Fix

Changed:

     WinSendMsg (hwndFrame, WM_SETICON,
                 WinQuerySysPointer (HWND_DESKTOP, SPTR_APPICON, FALSE),
                 NULL) ;

To:

     WinSendMsg (hwndFrame, WM_SETICON,
                 (MPARAM) WinQuerySysPointer (HWND_DESKTOP, SPTR_APPICON, (BOOL) FALSE),
                 NULL) ;

warning: pointer targets in passing argument 4 of 'GpiCharStringAt' differ in signedness

Warning
vf01.c: In function 'Display_24Point':
vf01.c:44:38: warning: pointer targets in passing argument 4 of 'GpiCharStringAt' differ in signedness [-Wpointer-sign]
   44 |                            szFacename[iFont]) ;
      |                            ~~~~~~~~~~^~~~~~~
      |                                      |
      |                                      CHAR * {aka char *}
In file included from C:/usr/include/os2.h:39,
                 from vf01.c:6:
C:/usr/include/os2emx.h:9050:11: note: expected 'PCCH' {aka 'const unsigned char *'} but argument is of type 'CHAR *' {aka 'char *'}
 9050 |      PCCH pchString);
      |      ~~~~~^~~~~~~~~
Fix

Changed

          GpiCharStringAt (hps, &ptl, (LONG) strlen (szFacename[iFont]),
                           szFacename[iFont]) ;

to

          GpiCharStringAt (hps, &ptl, (LONG) strlen (szFacename[iFont]),
                           (PCCH) szFacename[iFont]) ;


warning: pointer targets in passing argument 3 of 'GpiCharString' differ in signedness [-Wpointer-sign]

Warning
vf01.c:46:36: warning: pointer targets in passing argument 3 of 'GpiCharString' differ in signedness [-Wpointer-sign]
   46 |           GpiCharString (hps, 10L, " - abcdefg") ;
      |                                    ^~~~~~~~~~~~
      |                                    |
      |                                    char *
In file included from C:/usr/include/os2.h:39,
                 from vf01.c:6:
C:/usr/include/os2emx.h:9048:57: note: expected 'PCCH' {aka 'const unsigned char *'} but argument is of type 'char *'
 9048 | LONG APIENTRY GpiCharString (HPS hps, LONG lCount, PCCH pchString);
      |                                                    ~~~~~^~~~~~~~~
Fix

Changed

 GpiCharString (hps, 10L, " - abcdefg") ;

to

GpiCharString (hps, 10L, (PCCH) " - abcdefg") ;

warning: missing braces around initializer

Warning
vectfont.c:55:34: warning: missing braces around initializer [-Wmissing-braces]
   55 |                    vectfont [] = {
      |                                  ^
Fix

Changed

vectfont [] = {
                                 IDM_NOTHING,     NULL,
                                 IDM_24POINT,     Display_24Point,
                                 IDM_MIRROR,      Display_Mirror,
                                 IDM_STRETCH,     Display_Stretch,
                                 IDM_CHARANGLE,   Display_CharAngle,
                                 IDM_ROTATE,      Display_Rotate,
                                 IDM_CHARSHEAR,   Display_CharShear,
                                 IDM_SHADOW,      Display_Shadow,
                                 IDM_HOLLOW,      Display_Hollow,
                                 IDM_DROPSHADOW,  Display_DropShadow,
                                 IDM_BLOCK,       Display_Block,
                                 IDM_NEON,        Display_Neon,
                                 IDM_FADE,        Display_Fade,
                                 IDM_SPOKES,      Display_Spokes,
                                 IDM_WAVY,        Display_Wavy,
                                 IDM_MODSPOKES,   Display_ModSpokes
                                 } ;

To

                   vectfont [] = {
                                 {IDM_NOTHING,     NULL},
                                 {IDM_24POINT,     Display_24Point},
                                 {IDM_MIRROR,      Display_Mirror},
                                 {IDM_STRETCH,     Display_Stretch},
                                 {IDM_CHARANGLE,   Display_CharAngle},
                                 {IDM_ROTATE,      Display_Rotate},
                                 {IDM_CHARSHEAR,   Display_CharShear},
                                 {IDM_SHADOW,      Display_Shadow},
                                 {IDM_HOLLOW,      Display_Hollow},
                                 {IDM_DROPSHADOW,  Display_DropShadow},
                                 {IDM_BLOCK,       Display_Block},
                                 {IDM_NEON,        Display_Neon},
                                 {IDM_FADE,        Display_Fade},
                                 {IDM_SPOKES,      Display_Spokes},
                                 {IDM_WAVY,        Display_Wavy},
                                 {IDM_MODSPOKES,   Display_ModSpokes}
                                 } ;

expected '=', ',', ';', 'asm' or '__attribute__' before

Error
APP.h:26:20: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'KidWndProc'
   26 | MRESULT FAR PASCAL KidWndProc  ( HWND, USHORT, MPARAM, MPARAM );
Fix

Changed

MRESULT FAR PASCAL KidWndProc	 ( HWND, USHORT, MPARAM, MPARAM );

to

MRESULT EXPENTRY KidWndProc	 ( HWND, USHORT, MPARAM, MPARAM );

MIN / MAX Missing

Warning
atccnr.c: In function 'CnrSubclassWndProc':
atccnr.c:768:33: warning: implicit declaration of function 'min'; did you mean '
main'? [-Wimplicit-function-declaration]
  768 |             arcp.lP = arcp.lQ = min (rclCnr.xRight, rclCnr.yTop) / 9;
      |                                 ^~~
      |                                 main
make: *** No rule to make target `-o', needed by `atccnr.exe'.  Stop.
Fix

Include to the .H file the following missing:

#ifndef max
#define max(a,b) (((a) > (b)) ? (a) : (b))
#endif
#ifndef min
#define min(a,b) (((a) < (b)) ? (a) : (b))
#endif

Seems like an old .H file that came with OS/2 used to have that declared and now is missing.

line(20): protmode

Warning
Warning! W1058: file ldSBPZPt.: line(20): protmode option not valid for an OS/2 EMX executable
Fix

Check the protmode on the .def file. In this case it was empty so I removed it. It was not needed.

returning 'int' from a function with return type 'MRESULT'

Warning
randrect.c:90:28: warning: returning 'int' from a function with return type 'MRESULT' {aka 'void *'} makes pointer from integer without a cast [-Wint-conversion]
   90 |                     return 1 ;
      |                            ^
Fix

Changed

return 1 ;

for

return (MRESULT) TRUE
Fix2

Change for:

return ((MRESULT)TRUE) ;

warning: comparison between pointer and integer

Warning
randrect.c:47:20: warning: comparison between pointer and integer
   47 |      if (hwndFrame != NULL)
Fix

Changed

if (hwndFrame != NULL)

to

if (hwndFrame != '\0')

UNDEF

Warning
gcc -Zomf atccnr.obj atccnr.res atccnr.def -o atccnr.exe
weakld: error: Unresolved symbol (UNDEF) 'ClientWndProc'.
weakld: info: The symbol is referenced by:
    C:/dev/DEV-SAMPLES-PM-Air_Traffic_Control_Container/atccnr.DEF
Error! E2028: ClientWndProc is an undefined reference
Error! E2044: exported symbol ClientWndProc not found
make: *** [atccnr.exe] Error 1

Fix

Removed the EXPORTS from "atccnr.DEF".

warning: format '%ld' expects argument of type 'long int'

Warning
atccnr.c:485:30: warning: format '%ld' expects argument of type 'long int', but argument 4 has type 'int' [-Wformat=]
  485 |         sprintf (szBuf, "%s%ld", apszCallSignPrefixes [rand() % cPrefixes],
      |                            ~~^
      |                              |
      |                              long int
      |                            %d
  486 |      rand() % 1000);
      |      ~~~~~~~~~~~~~           
      |             |
      |             int
Fix

Changed

 sprintf (szBuf, "%s%ld", apszCallSignPrefixes [rand() % cPrefixes],
					rand() % 1000);

to

 sprintf (szBuf, "%s%d", apszCallSignPrefixes [rand() % cPrefixes],
					rand() % 1000);

warning: pointer targets in initialization of 'unsigned char *'

Warning
atccnr.c: In function 'InsertContainerRecords':
atccnr.c:437:50: warning: pointer targets in initialization of 'unsigned char *' from 'char *' differ in signedness [-Wpointer-sign]
  437 |     static const PSZ apszCallSignPrefixes [] = { "AA", "DA", "UA", "TW" };
      |                                                  ^~~~
atccnr.c:437:50: note: (near initialization for 'apszCallSignPrefixes[0]')
atccnr.c:437:56: warning: pointer targets in initialization of 'unsigned char *' from 'char *' differ in signedness [-Wpointer-sign]
  437 |     static const PSZ apszCallSignPrefixes [] = { "AA", "DA", "UA", "TW" };
      |                                                        ^~~~
atccnr.c:437:56: note: (near initialization for 'apszCallSignPrefixes[1]')
atccnr.c:437:62: warning: pointer targets in initialization of 'unsigned char *' from 'char *' differ in signedness [-Wpointer-sign]
  437 |     static const PSZ apszCallSignPrefixes [] = { "AA", "DA", "UA", "TW" };
      |                                                              ^~~~
atccnr.c:437:62: note: (near initialization for 'apszCallSignPrefixes[2]')
atccnr.c:437:68: warning: pointer targets in initialization of 'unsigned char *' from 'char *' differ in signedness [-Wpointer-sign]
  437 |     static const PSZ apszCallSignPrefixes [] = { "AA", "DA", "UA", "TW" };
      |                                                                    ^~~~
atccnr.c:437:68: note: (near initialization for 'apszCallSignPrefixes[3]')
Fix

All these signed/unsigned character warnings can be resolved by adding "-DOS2EMX_PLAIN_CHAR" to the compiler flags. See 'os2emx.h' for details.

gcc -Wall -Zomf -DOS2EMX_PLAIN_CHAR -c -O2 atccnr.c -o atccnr.obj

cdecl - error: expected '=', ',', ';', 'asm' or '__attribute__' before 'main'

Error
browse.h:12:11: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'main'
   12 | int cdecl main(int, char *[]);
      |           ^~~~

Fix

Changed

int cdecl main(int, char *[]);

to

int _cdecl main(int, char *[]);


VOID Main issue

Error
Issue on main
Fix

Changed

VOID main( VOID )

to

int main( VOID )

Linkers

Change to WLINK

You need to add:

set EMXOMFLD_TYPE=WLINK
set EMXOMFLD_LINKER=wl.exe

Remember that the Wacom Linker is "wl.exe" and is on the "watcom-wlink-hll" RPM package.

Resource Compiler

Change to WRC

You need to add:

SET EMXOMFLD_RC_TYPE=WRC
SET EMXOMFLD_RC=wrc.exe

Remember that the Wacom Resource Compiler is "wrc.exe" and it is on the "watcom-wrc" RPM Package

Resource Compiler

Error 1
Reading binary resource file walker.res

(0) RC: error - Only integer TYPE allowed ().
RC: 1 error detected

make: *** [walker.exe] Error 1
It is possible of an error on the SET INCLUDE directory. Type %INCLUDE% and check if it is pointing to the directory that contains OS2.H
Error 2
[E:\PROJECTS\SAMPLEPACK\PMWALKER]make   2>&1  | tee make.out
wrc -r walker.rc
Open Watcom Windows and OS/2 Resource Compiler Version 2.0beta1 LA
Portions Copyright (c) 1993-2002 Sybase, Inc. All Rights Reserved.
Source code is available under the Sybase Open Watcom Public License.
See http://www.openwatcom.org/ for details.
walker.rc(2): Error! E062:  Unable to open 'os2.h'
make: *** [walker.res] Error 9
It is possible of an error on the SET INCLUDE directory. Type %INCLUDE% and check if it is pointing to the directory that contains OS2.H