2011-05-03 7 views
7

Tengo una serie de clases de C++ almacenadas en una biblioteca con una interfaz C (ver ejemplo a continuación). Y tengo un programa en C que incluye esta libreria de C++ a través de la interfaz C. Esto parece funcionar bien hasta que intenté crear una clase en la biblioteca con new y delete.nuevo y eliminar en una biblioteca C++ que se llama desde un programa en C

Estoy usando gcc para compilar el código C y g ++ para la libreria de C++, elaboré los proyectos con Eclipse en unbunu.

El mensaje de error que me sale es el archivo

undefined reference to 'operator new(unsigned int)' 
undefined reference to 'operator delete(void*)' 

Libary H

#ifndef CFOO_H_ 
#define CFOO_H_ 
#ifdef __cplusplus 

class CBar { 
    public: 
     int i ; 
}; 

class CFoo { 
    public: 
     int work(); 
}; 
extern CFoo g_foo ; 
extern "C" { 
#endif /* __cplusplus */  
    int foo_bar() ;  
#ifdef __cplusplus 
} 
#endif /* __cplusplus */ 
#endif /* CFOO_H_ */ 

archivo archivo c principal CPP Libary

#include "CFoo.h" 
CFoo g_foo ; 

int CFoo::work() { 
    CBar * b = new CBar(); 
    delete b; 
    return 1; 
} 

int foo_bar() { 
    return g_foo.work(); 
} 

void * __gxx_personality_v0 ; 
int main(void) { 
printf("foo_bar 10 =%d\n", foo_bar()) ; 
    return 0; 
} 

He intentado algunas cosas sin éxito, ¿alguna idea?

Editar

Parece que había un problema con el auto generada hacer que los archivos producidos por Eclipse. Una vez que cambié manualmente el archivo M de las aplicaciones para vincular con g ++ en lugar de gcc, pude construir la aplicación. Ver comentarios a continuación para más información.

+0

Este es un problema de enlace, no de código. ¿Puede darnos información sobre cómo enlaza su código? – Jerome

+8

No está enlazando en el tiempo de ejecución de C++. Deberías usar "g ++" como el comando de enlace, en lugar de "gcc". –

+1

Si algún código C++ está en el programa, la unidad de traducción que contiene 'main' debe compilarse como código C++, no como código C. – aschepler

Respuesta

10

Citando unapersson: No está enlazando en el tiempo de ejecución de C++. Deberías usar "g ++" como el comando de enlace, en lugar de "gcc".

+0

¿Cómo me vincularía con g ++ pero aun así compilaría con gcc o clang? –

Cuestiones relacionadas