(newbie) can compile with gcc but not with g++

llewelly@xmission.com llewelly@xmission.com
Sat Apr 10 02:38:00 GMT 2004


Kamaraju Kusumanchi <kk288@cornell.edu> writes:

> Hi all
>   I am a newbie regarding c/c++ programming. From what I read, If I
> write a C program, I can compile with both gcc and g++.

Sometimes. C++ is not 100% backward compatible with C - more like 95%.

Stroustrup covers this in TC++PL3 (a book every C++ programmer should
    own), section B.2 . However, your program is outside the scope of
    compatiblity between C and C++.

Your issue is with C++ compatiblity with Fortran, *not* C compatiblity
    with C++.

> I'm not able
> to do the later. Here are the details.
> 
> I compiled the clapack package (downloaded from netlib) on intel p4
> 2.8 using gcc (3.3.3). I am using debian testing. Consider the
> following program
> 
> #include <stdio.h>

I think this program needs something like this:

extern "C" void dgesv_(int*, int*, double*, int*, int*, double*, int*, int*);


I'm guessing that your fortran library uses C calling conventions. If
    it doesn't, I don't know what the answer is.

> 
> int main()
> {
>   double a[16] = {11,14,15,16,7,10,13,12,5,6,8,9,1,2,3,4};
>   /* Actual matrix is     11   7   5  1
>    *                      14  10   6  2
>    *                      15  13   8  3
>    *                      16  12   9  4
>    */
>   double b[4] = {1.2,3.2,6.2,2.4};
>   int M=4,N=1,lda=4,ldb=4,ipiv[4],info, ret;
>   int i,j;
> 
>   for(i=0; i<4; i++) {
>     for(j=0; j<4; j++) {
>       printf("%f ", a[i*4+j]);
>     }
>     printf("\n");
>   }
>   for(i=0; i<4; i++) printf("%f\n", b[i]);
>   dgesv_(&M, &N, a, &lda, ipiv, b, &ldb, &info);

C++ requires all functions to have appropriate declarations.

>   for(i=0; i<4; i++) printf("%f\n", b[i]);
>   // Correct answer is -0.76, 1.83, -0.51, -0.70
>   printf("%d\n",info);
>  return 0;
> }
> 
> I am able to run this program with gcc using the following commands.
> 
> gcc -c -O2 ludecomp.c
> gcc ludecomp.o libtmglib.a liblapack.a libblas.a libF77.a libI77.a -lm -lc
> ./a.out
> 
> But when I use g++, I am getting the following error
> 
> mv ludecomp.c ludecomp.cpp
> g++ -c ludecomp.cpp
> ludecomp.cpp: In function `int main()':
> ludecomp.cpp:22: error: `dgesv_' undeclared (first use this function)
> ludecomp.cpp:22: error: (Each undeclared identifier is reported only
> once for
>    each function it appears in.)
[snip]



More information about the Gcc-help mailing list