Forums before death by AOL, social media and spammers... "We can't have nice things"
|    comp.lang.fortran    |    Putting John Backus on a giant pedestal    |    5,127 messages    |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
|    Message 4,892 of 5,127    |
|    Steven G. Kargl to Lynn McGuire    |
|    Re: nasty link problem with Gfortran and    |
|    07 Jan 25 22:40:18    |
   
   From: sgk@REMOVEtroutmask.apl.washington.edu   
      
   On Tue, 07 Jan 2025 15:35:38 -0600, Lynn McGuire wrote:   
      
   > I just ran into a nasty problem with GFortran and G++ (C++). Probably   
   > not a bug ??? I am using GCC 14.1.   
   >   
   > I have a lot of code in C++ (over 100,000 lines). I have 750,000 lines   
   > of code in GFortran. I have to extern "C" this code in C++ to make it   
   > callable by GFortran code.   
   >   
   > I missed declaring a couple of C++ functions as extern "C" which means   
   > that they kept their C++ mangled link names. But these C++ functions   
   > were declared as integer*8 and external in the GFortran code (old F77   
   > code).   
   >   
   > So, the GCC linker did not report to me that it did not have a link for   
   > the G++ functions. This may be a bug, I am not sure.   
   >   
   > When I ran the program, the C++ functions were not called by the   
   > GFortran code. Instead, the GFortran code treated the C++ functions as   
   > integer*8 scalar variables.   
   >   
   > If needful, I can probably put together a small code sample that   
   > exhibits the problem. Maybe. It could be that the size of my code   
   > affects the GCC linker.   
   >   
   > I removed the Gfortran code "external" keywords, extern "C" the C++   
   > functions, added the C++ function to my module list, and got a working   
   > link.   
      
      
   Need to see some actual code.   
      
   % cat > foo.c   
   int   
   foo(void)   
   {   
    return (1);   
   }   
   % gcc14 -c foo.c   
   % nm foo.o   
   0000000000000000 T foo   
   % g++14 -c foo.c   
   % nm foo.o   
   0000000000000000 T _Z3foov   
   % cat > foo.f90   
   integer*8 function foo()   
    foo = 1   
   end   
   % gfortran14 -c foo.f90   
   % nm foo.o   
   0000000000000000 T foo_   
      
   So, with gcc, you get the symbol foo. With g++, you get the mangled   
   named _Z3foov. With gfortran, you get foo_.   
      
      
      
   --   
   steve   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   
|
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
(c) 1994, bbs@darkrealms.ca