2010-09-17 21 views
16

Estoy intentando construir un ejecutable de prueba unitaria simple, usando cpputest. Construí el framework cpputest en una biblioteca estática, y ahora intento vincularlo en un ejecutable. Sin embargo, estoy vinculado a una configuración Makefile bastante complicada, debido al código relacionado.Referencia no definida al operador nuevo

Esta es mi línea de comandos:

/usr/bin/qcc -V4.2.4,gcc_ntoarmle_acpp-ne -lang-c++ -O2 -g -g -o Application/UnitTests/Tests/symbols/UnitTestExe -Wl,--start-group Application/UnitTests/Tests/../.objs/main.o Application/UnitTests/lib/libcpputest.a -Wl,--end-group -lm 

Estoy recibiendo muchos errores como el siguiente:

Application/UnitTests/lib/libcpputest.a(CommandLineTestRunner.o): In function `CommandLineTestRunner::parseArguments(TestPlugin*)': 
    Application/UnitTests/cpputest/src/CppUTest/.objs/../CommandLineTestRunner.cpp:114: undefined reference to `operator new(unsigned int, char const*, int)' 

no puedo averiguar qué está causando esto. ¿No obtengo operador nuevo gratis con C++?

+0

Es realmente difícil ayudar con esta información. Intente * reducir * las condiciones necesarias para reproducir el problema. La línea de comando anterior es demasiado compleja, incluso si asumimos que el código es directo y no hace cosas como redefinir 'operator new'. –

+0

¿Se ha informado el primer error de un operador nuevo error? Si no, ¿cuál es el primer error informado? –

+0

Sí, los únicos errores informados son errores nuevos del operador. El que se muestra es el primero. – mbyrne215

Respuesta

6

Hay muy poca información en su pregunta para poder trabajar, pero parece algo de código utiliza algún tipo de colocación de nueva, y al mismo tiempo tan especial operator new es declaró (el compilador encuentra y compila el código usándolo), el enlazador no puede encontrar su definición.

+0

No estoy seguro de qué otra información agregar. El código es realmente simple; no redefine 'nuevo', por lo que no puedo entender por qué el enlazador no puede encontrarlo desde la biblioteca estándar. – mbyrne215

+1

@ mbyrne215: podría agregar el código más simple que reproduce esto. El mensaje de error menciona claramente un 'operador nuevo (unsigned int, char const *, int)' (llamado desde 'CommandLineTestRunner :: parseArguments (TestPlugin *)'), que claramente no es la versión estándar de ese operador. – sbi

+2

Tienes razón; Me obsesioné tanto por ver por qué las bibliotecas estándar no funcionaban, no miré atentamente la biblioteca de terceros. Estaba redefiniendo secretamente lo nuevo. Eliminé esa parte y todo está bien. Gracias. – mbyrne215

46

Es probable que necesite establecer un enlace con la biblioteca de tiempo de ejecución de compatibilidad de C++. Esto sucede automáticamente cuando invocas g ++. En Linux, esto se logra agregando -lstdC++ bandera al enlazador. Tienes que descubrir cómo hacer lo mismo en tu plataforma.

+0

+1, gracias .. – Oli

+0

esta fue la respuesta que resolvió el problema que tuve – yota

4

Necesita reconstruir su código desde cero, incluida la biblioteca. Obtuve este error porque inadvertidamente copié archivos de objetos compilados en otra máquina (con el resto de la fuente) a mi máquina. Lo más probable es que esto altere el paso de enlace ya que ahora hay dos tipos de archivos de objetos, nativos (para los archivos fuente modificados) y no nativos (todos los demás). Estoy adivinando aquí, pero el operador 'nuevo' significa cosas ligeramente diferentes en diferentes arquitecturas y es por eso que está obteniendo este error.

p.s. Sé que es demasiado tarde para una respuesta útil, pero todavía estoy publicando esto para el registro.

+0

en mi caso había algunos archivos .o, de mi predecesor, después de una limpieza, todo funcionó como un amuleto – aldr

0

Tal vez está llamando gcc, el compilador de C en lugar de g++, que es el compilador de C++.

0

Para QNX 6.5.0 He especificado marcar -lang-c++ para qcc (gcc) para evitar el error.

Cuestiones relacionadas