tags:

views:

200

answers:

3

Possible Duplicate:
C code compiles as C++, but not as C

Edit:

I recompiled the source for the library as C, and that fixed it.

I've got this code I need to use in my application. It's for writing to the serial port, and I can't figure out how to get it to run in C. I've got a version in C++, as well as a version that looks more like C, designed to compile with the Borland C++ 5.5 compiler, but I can't get it to compile there or in my project.

Edit: I should note that it compiles (and links) when I compile as c++, but not when I compile as c.

Here's the linker error I get:

1>InpoutTest.obj : error LNK2019: unresolved external symbol _Out32@8 referenced in function _main
1>InpoutTest.obj : error LNK2019: unresolved external symbol _Inp32@4 referenced in function _main

Here's the c++ code. I don't need the command line functionality, I just need to be able to call Out32(). I don't even need to be able to read.

#include "stdafx.h"
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
/* ----Prototypes of Inp and Outp--- */

short _stdcall Inp32(short PortAddress);
void _stdcall Out32(short PortAddress, short data);

/*--------------------------------*/

int main(int argc, char* argv[])
{

    int data;

    if(argc<3)
    {
        //too few command line arguments, show usage
        printf("Error : too few arguments\n\n***** Usage *****\n\nInpoutTest read <ADDRESS> \nor \nInpoutTest write <ADDRESS> <DATA>\n\n\n\n\n");
    } 
    else if(!strcmp(argv[1],"read"))
    {

        data = Inp32(atoi(argv[2]));

        printf("Data read from address %s is %d \n\n\n\n",argv[2],data);

    }
    else if(!strcmp(argv[1],"write"))
    {
        if(argc<4)
        {
            printf("Error in arguments supplied");
            printf("\n***** Usage *****\n\nInpoutTest read <ADDRESS> \nor \nInpoutTest write <ADDRESS> <DATA>\n\n\n\n\n");
        }
        else
        {
        Out32(atoi(argv[2]),atoi(argv[3]));
        printf("data written to %s\n\n\n",argv[2]);
        }
    }



    return 0;
}

Here's the other sample:

#include <stdio.h>
#include <conio.h>
#include <windows.h>


/* Definitions in the build of inpout32.dll are:            */
/*   short _stdcall Inp32(short PortAddress);               */
/*   void _stdcall Out32(short PortAddress, short data);    */


/* prototype (function typedef) for DLL function Inp32: */

     typedef short _stdcall (*inpfuncPtr)(short portaddr);
     typedef void _stdcall (*oupfuncPtr)(short portaddr, short datum);

int main(void)
{
     HINSTANCE hLib;
     inpfuncPtr inp32;
     oupfuncPtr oup32;

     short x;
     int i;

     /* Load the library */
     hLib = LoadLibrary("inpout32.dll");

     if (hLib == NULL) {
          printf("LoadLibrary Failed.\n");
          return -1;
     }

     /* get the address of the function */

     inp32 = (inpfuncPtr) GetProcAddress(hLib, "Inp32");

     if (inp32 == NULL) {
          printf("GetProcAddress for Inp32 Failed.\n");
          return -1;
     }


     oup32 = (oupfuncPtr) GetProcAddress(hLib, "Out32");

     if (oup32 == NULL) {
          printf("GetProcAddress for Oup32 Failed.\n");
          return -1;
     }


/***************************************************************/
/* now test the functions */

     /* Try to read 0x378..0x37F, LPT1:  */

     for (i=0x378; (i<0x380); i++) {

          x = (inp32)(i);

          printf("port read (%04X)= %04X\n",i,x);
     }



     /*****  Write the data register */

     i=0x378;
     x=0x77;

     (oup32)(i,x);

     printf("port write to 0x%X, datum=0x%2X\n" ,i ,x);

     /***** And read back to verify  */
     x = (inp32)(i);
     printf("port read (%04X)= %04X\n",i,x);



     /*****  One more time, different value */

     i=0x378;
     x=0xAA;

     (oup32)(i,x);

     printf("port write to 0x%X, datum=0x%2X\n" ,i ,x);

     /***** And read back to verify  */
     x = (inp32)(i);
     printf("port read (%04X)= %04X\n",i,x);




     FreeLibrary(hLib);
     return 0;
}

Any help would be appreciated.

A: 

This code looks like it's reading/writing the printer port, not the serial port. It's doing that by loading some DLL that gives direct access to the hardware. To get it to work, you'll need to use the same (or similar) DLL. From the looks of things, it's using Inpout32.dll, so getting that might be helpful.

Jerry Coffin
I do have Inpout32.dll.
Colin DeClue
Also, I meant printer/parallel port, rather than serial port. Good catch.
Colin DeClue
+1  A: 

You might need to wrap the prototypes of Inp32/Outp32 with "extern C { /* ... */ }".

Roddy
That might make sense if it had trouble compiling as C++ rather than c, but it's the c compiling that's the problem.
Colin DeClue
Oops, sorry, my mistake...As MartinB pointed out, the C version uses LoadLibrary; are you linking against Inpout32.dll or Inpout32.lib? My understanding is that you need to link against the import library (Inpout32.lib) so that the linker can resolve e.g. Inp32 and Outp32 to *something* while deferring the implementation to Inpout32.dll.
Roddy
I added Inpout32.lib to the command line options of the linker. Is that wrong? Is there some other step I need to take towards that end?
Colin DeClue
A: 

I had to recompile the library as C, then use that version. The existing version was compiled as C++.

Colin DeClue