Unix Programming - mixing C and C++ libs

This is Interesting: Free IT Magazines  
Home > Archive > Unix Programming > October 2004 > mixing C and C++ libs





You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

Author mixing C and C++ libs
Uwe Mayer

2004-10-26, 2:47 am

Hi,

I have problems linking a c++ program to a C static archive (.a). I don't
know wether this is at all possible nor am I sure that this is the source
of my problems, but the g++ outputs the following:

g++ sf2raw.c \
-I../Smartspace/Development/Infrastructure/sources/sffile \
-I/usr/include/qt3 \
-lqt-mt -L$(QTDIR) \
-L ../Smartspace/Development/Infrastructure/sources/sffile \
../Smartspace/Development/Infrastructure/sources/sffile/libsffile.a \
-o sf2raw

/tmp/cckWYOAh.o(.text+0x297): In function `main':
: undefined reference to `sf_file_attach(int, sf_file_error*)'
/tmp/cckWYOAh.o(.text+0x2bd): In function `main':
: undefined reference to `sf_file_get_type(sf_file*, sf_file_error*)'

[...] //some more "undefined reference" errors

/tmp/cckWYOAh.o(.text+0x7d2): In function `main':
: undefined reference to `sf_file_detach(sf_file*, sf_file_error*)'
/tmp/cckWYOAh.o(.gnu.linkonce.t._Z19handle_sf_fileErrorPKc+0x1e): In
function `handle_sf_fileError(char const*)':
: undefined reference to `sf_file_perror(sf_file_error const*, char const*)'
collect2: ld returned 1 exit status


The sf_file_attach, etc. are defined in sffile.h, which reside in the above
include folder and there is also its object file sffile.o and the
libsffile.a.

sf2raw.c was originally a C program, so is all the Smartspace stuff, but I
changed the source of sf2raw.c to compile with g++ in order to be able to
link it against the qt libraries.

Anyone an idea what's wrong with the above?

Thanks in advance
Uwe
DINH Viet Hoa

2004-10-26, 2:47 am

Uwe Mayer wrote :

> The sf_file_attach, etc. are defined in sffile.h, which reside in the above
> include folder and there is also its object file sffile.o and the
> libsffile.a.


is there some :

#ifdef _cplusplus
extern "C" {
#endif

/* content_of_h_file */

#ifdef _cplusplus
}
#endif

in you sffile.h ?

--
DINH V. Hoa,

"j'arrête l'alcool" -- Arsunique

Uwe Mayer

2004-10-26, 2:47 am

Tuesday 26 October 2004 09:30 am DINH Viet Hoa wrote:

> Uwe Mayer wrote :
>
[vbcol=seagreen]
> is there some :
>
> #ifdef _cplusplus
> extern "C" {
> #endif
>
> /* content_of_h_file */
>
> #ifdef _cplusplus
> }
> #endif
>
> in you sffile.h ?


no.

Is that all to be added?

Thanks,
Uwe
Nils O. Selćsdal

2004-10-26, 2:47 am

Uwe Mayer wrote:
> Tuesday 26 October 2004 09:30 am DINH Viet Hoa wrote:
>
>
>
>
>
>
>
> no.
>
> Is that all to be added?

Yes, the C++ compiler have to be told that the code is C,
else it will apply C++ check/namemangling/etc to it.


--
Nils O. Selćsdal
www.utelsystems.com
Uwe Mayer

2004-10-26, 7:47 am

Tuesday 26 October 2004 09:47 am "Nils O. SelÄsdal" wrote:

> Yes, the C++ compiler have to be told that the code is C,
> else it will apply C++ check/namemangling/etc to it.


Graphic! It worked. I had to compile the sffile with g++, too, of course.
But: I guess it won't work with ordinary C programs any more, right?

I'd go symlink the .c file to a .cc file and modify the Makefile to produce
two versions of the archife.
Is there any naming convention for libs /archives which have to be present
as both C and C++ binaries?

Thanks,
Uwe

Nils O. SelÄsdal

2004-10-26, 7:47 am

Uwe Mayer wrote:
> Tuesday 26 October 2004 09:47 am "Nils O. SelÄsdal" wrote:
>
>
>
>
> Graphic! It worked. I had to compile the sffile with g++, too, of course.
> But: I guess it won't work with ordinary C programs any more, right?

hmm, you shouldn't need that though. You did apply the
extern "C" .. to all C header files ?


--
Nils O. SelÄsdal
www.utelsystems.com
Uwe Mayer

2004-10-26, 7:47 am

Tuesday 26 October 2004 13:24 pm "Nils O. SelÄsdal" wrote:

[vbcol=seagreen]
> hmm, you shouldn't need that though. You did apply the
> extern "C" .. to all C header files ?


The archive really only exists from one header file. I modified this one. I
just wondered wether other C programs that are compiled with gcc can link
to this archive which was created with g++.

Ciao
Uwe
Paul Pluzhnikov

2004-10-26, 5:51 pm

Uwe Mayer <merkosh@hadiko.de> writes:

> I just wondered wether other C programs that are compiled with gcc can link
> to this archive which was created with g++.


Rather than "just wonder", you should read-up on C++ name mangling.

Once you *understand* how it works and why 'extern "C"' was
necessary, you can answer your own question (and make the first
step to becoming enlightened

Yes, archive libraries created from objects compiled with g++
can be linked into "plain C" programs, prvided none of the C++
features (exceptions, constructors, operator new, etc.) were used
in the source.

Cheers,
--
In order to understand recursion you must first understand recursion.
Remove /-nsp/ for email.
Sponsored Links






Free braindumps | Software forum | Database administration forum

Copyright 2003 - 2008 webservertalk.com