Article: Q30271
Product(s): See article
Version(s): 4.00 4.00b 4.50
Operating System(s): MS-DOS
Keyword(s): ENDUSER | B_BasicCom S_C S_QuickC | mspl13_basic
Last Modified: 13-MAR-1990
The following article explains how to compile and link the example of
linking QuickBASIC to Microsoft C shown on Page 391 of the "Microsoft
QuickBASIC 4.0: BASIC Language Reference" manual for Versions 4.00 and
4.00b, and Page 391 of the "Microsoft BASIC Compiler 6.0: BASIC
Language Reference" manual for Microsoft BASIC Compiler Versions 6.00
and 6.00b for MS-DOS and MS OS/2.
This article also explains how to use the LINK /NOE and /NOD options
to eliminate error messages when linking to C.
When linking BASIC to C (or to other Microsoft languages), please note
the following information about using the LINK /NOE and /NOD options:
1. Notes for using LINK /NOE Option are as follows:
The LINK /NOE option is required for interlanguage calling to
eliminate the following error message:
xx.LIB : error L2044: __xxxxx : symbol multiply defined, use /NOE
The Microsoft language libraries, such as LLIBCE.LIB from C and
BRUN40.LIB from QuickBASIC, contain some of the same routines;
thus, they require LINK /NOE.
If you still get a "symbol multiply defined" message after using
the LINK /NOE option, then the multiply defined symbols in your
source code need to be renamed, recompiled, and relinked.
The /NOE option is documented only in the README.DOC file on a disk
in QuickBASIC 4.00 and 4.00b and in BASIC compiler 6.00 and 6.00b.
In QuickBASIC Version 4.50, /NOE is documented on Page 365 of the
"Microsoft QuickBASIC 4.5: Programming in BASIC" manual.
2. Notes for using LINK /NOD Option are as follows:
Note that an .OBJ file compiled with QuickBASIC 4.00, 4.00b, or
4.50, or C 5.00 or 5.10 contains information telling the linker
what .LIB file to look for at link time.
If you use the LINK /NOD option, you are telling the linker not to
search any specified library in the .OBJ file to resolve external
references. Thus, if you use the /NOD option, you must explicitly
specify the name of the .LIB language libraries for both C and
QuickBASIC in the LINK command (even if the .LIB library has a path
set to it with SET LIB=path). If you do not, LINK.EXE will give the
following error:
LINK : error L2029: Unresolved Externals
Code Example
------------
The following steps describe how to compile and link the code example
shown at the bottom of this article (taken from Page 391 of the
BASIC language reference manuals):
1. Compile cf.bas and cfunc.c (shown farther below) as follows:
BC CF.BAS;
CL /C /AL CFUNC.C
You may also use the C medium-memory model: CL /C /AM CFUNC.C. This
example uses CL.EXE from Microsoft C Versions 5.00 and 5.10.
2. Type SET at the DOS command line to make sure that you issued a
statement similar to "SET LIB=C:\QB.400;C:\C.500" to tell LINK.EXE
where to look for .LIB files at link time.
3. Link the BASIC and C routines, specifying the BASIC routine first
and using LINK.EXE Version 3.61 or later:
LINK CF.OBJ+CFUNC.OBJ/NOE;
CF.BAS
------
REM BASIC routine cf.bas:
DEFINT A-Z
DECLARE SUB cfunc CDECL (BYVAL x AS INTEGER)
beforecall = SETMEM(-2048)
cfunc (1024)
aftercall = SETMEM(3500)
IF aftercall <= beforecall THEN PRINT "memory not reallocated."
END
CFUNC.C
-------
/* C routine cfunc.c: */
void far cfunc(bytes)
int bytes;
{
char *malloc();
char *workspace;
workspace=malloc((unsigned) bytes);
free(workspace);
}