PRB: putchar Fails in C Code Called from FORTRAN Application (118396)



The information in this article applies to:

  • Microsoft Fortran Powerstation 32 for Windows NT 1.0
  • Microsoft Fortran Powerstation 32 for Windows NT 4.0

This article was previously published under Q118396

SYMPTOMS

In a mixed-language program, compiling the FORTRAN code using the /MD option prevents the C Run Time function "putchar" from operating.

For Fortran PowerStation 4.0, the following warning message is generated:
LINK: warning LNK4098: defaultlib "LIBC" conflicts with use of other libs; use /NODEFAULTLIB:library

CAUSE

This behavior is by design. You cannot safely mix objects built for different program execution models. In this case, putchar('c') is a macro that expands to putc(c,stdout) and stdout is defined differently in MSVCRT.LIB than it is in the statically linked libraries.

RESOLUTION

To work around this problem, either

  • Use the /MD option on the C code as well. -or-
  • Compile the Fortran code using /MT instead of using /MD.

MORE INFORMATION

To generate the problem, compile the C code using Visual C++ 32-bit Edition and compile the FORTRAN program using option /MD. Include the C object module on the compile line so that it is passed to the linker. The command lines used are as follows:
   CL -c C_SAMPLE.C
   FL32 -MD F_SAMPLE.FOR C_SAMPLE.OBJ
				
Run the sample code. It fails to display the letter "c" after "in the dll".

The program will run without error if the FORTRAN program is compiled using the /MT option instead of the /MD option.

Sample Code: FORTRAN

C Compile options needed: /MD

      INTERFACE TO SUBROUTINE csub [C,ALIAS:'_csub']()
      END
      WRITE(*,*) 'In the main'
      CALL csub()
      END
				

Sample Code: C

 
    #include <stdio.h>
   #include <string.h>

   #define DLLexport _declspec(dllexport)

   DLLexport void csub();
   void csub()
   {
      printf("\nIn the dll\n");
      putchar('c');
   }
				

Modification Type:MajorLast Reviewed:10/17/2003
Keywords:kbCompiler KB118396