2010-05-13 17 views
6

Tengo un pequeño programa que puedo compilar con GCC e ICC sin ninguna dificultad, pero también me gustaría que el código funcione con G ++ e ICPC. He intentado añadir esto:C código compilado con C++: referencia indefinida

#ifdef __cplusplus 
    extern "C" { 
#endif 

al principio y esto:

#ifdef __cplusplus 
    } 
#endif 

al final de todos los archivos de cabecera, pero todavía consigo varios `referencia indefinida a "..."' errores

+0

Primera idea: ¿se define __cplusplus? – Default

+1

sí, está definido por los compiladores de C++ (o al menos, los que uso) – Suugaku

+0

posible duplicado de [pregunta de novato: ¿Cuándo usar extern "C" {// code}?] (Http://stackoverflow.com/questions/ 2796796/newbie-question-when-to-use-extern-c-code) –

Respuesta

7

Creo que se está equivocando ... La C externa es para desactivar la función de modificar; entonces, si lo hace solo para los archivos de cabecera, cuando intente vincular su código de objeto mutilado, los nombres de función declarados no coincidirán con los nombres de función en el archivo de objeto.

De todos modos, la C externa no agregará ninguna portabilidad si toda la aplicación se compila y se vincula con el mismo compilador de C++, está destinada a mezclar bibliotecas C con código C++.

Si el código está en el subconjunto común de C y C++, ya debería ser capaz de compilar con cualquiera compilador, pero no puede ver la razón para hacer eso (además de trabajar en el principio de la menor sorpresa, como C++ es más estricto con algunas cosas).

2

Obtiene referencias no definidas porque la declaración y la definición no coinciden si coloca extern "C", lo que impide que se produzca el cambio de nombre: en este caso, esto solo ocurre en los archivos de encabezado.

1

Si una de las referencias indefinidas es gxx_personality, entonces diría que la publicación de "fortran" es correcta.

+0

Nada sobre gxx_personality, solo obtengo referencias indefinidas para dos funciones bastante simples. Una de las "funciones no definidas" está en el archivo "a.h/a.c" y se puede usar de forma correcta en estos archivos, pero por alguna razón no funciona en el archivo "b.c". – Suugaku

Cuestiones relacionadas