Pregunta

No tengo ninguna experiencia significativa con C ++, pero recientemente tuvo que estar involucrados en el proyecto con C ++ parte (módulos de Apache, en realidad).

En este momento estoy tratando de construir algo de código heredado mucho existente y enfrentar el problema muy raro cuando VC enlazador ++ no puede encontrar una función particular en la biblioteca Apache (mientras que ver el resto de ellos) .

El código es así (como tomada de la muestra trivial construido específicamente para hacer frente a este problema):

ap_rputs(ap_gm_timestr_822(r->pool, time(NULL)), r);

(esto sólo debe imprimir la fecha actual, pero en realidad no importa mucho)

Y el error que estoy recibiendo es la siguiente:

error LNK2019: unresolved external symbol _ap_gm_timestr_822@12 referenced in function _hello_handler

Ahora a la parte extraña: esta función existe realmente en la biblioteca estoy enlazando con, pero su nombre simbólico existe _ap_gm_timestr_822 @ 8 (no @ 12 , pero @ 8 al final).

He intentado jugar con casi todos los posibles bienes compilador / enlazador en MSVC ++ -. A ningún efecto, por desgracia

¿Podría este problema se relaciona con el hecho de que la biblioteca (que es parte de la distribución Apache 1.3) se construye con a / mayor / ... compilador diferente de lo que yo estoy usando? Actualmente estoy usando MS VC ++ Express 2008. Si este es el caso, ¿alguien tiene una idea de lo que se puede hacer para solucionar este problema?

¿Fue útil?

Solución

El typedef time_t viene en dos sabores, de legado 32-bits que va a crear el problema Y2K38 y 64-bits, la solución a ese problema. Tienes un desajuste aquí.

Compruebe el archivo de cabecera time.h del CRT que utilice, debe ser un #ifdef en ella que selecciona entre el legado y la versión de 64 bits. Evitar el uso de herencia si todavía espera ser un programador para el año 2038.

Otros consejos

En Visual Studio, el sufijo @ indica el tamaño total de bytes de los argumentos. El hecho de que se diferencia entre las dos funciones significa una falta de coincidencia de la firma. Lo más probable, dada la diferencia de tamaño, que está tratando de enlace a la función de 32 bits de 64 bits.

Estos nombres componen son los nombres de la función combinada con detalles del tipo de argumentos.

Así que el archivo de cabecera va a incluir la función declarada con argumentos que no coinciden con el lib está vinculando con.

Me han afectado a este más a menudo cuando un “-Definir” está mal en la línea de comandos del compilador, por lo que elegir una opción en el archivo de cabecera que no coincide con la lib está vinculando con. A menudo esto es con la selección de la “rosca” que desea, o si desea Unicode.

A fin de comprobar si la línea de comandos del compilador se adapta de manera correcta enlazador línea de comandos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top