2010-08-12 18 views
7

En el trabajo tenemos un archivo DLL de extensión de MFC que construyó bien con 1.35 pero cuando construido con 1,43 hace que el siguiente error:actualización de BOOST 1,35 a 1,43 provoca error de vinculador con __pRawDllMain (MFC relacionada)

error LNK2005: __pRawDllMain already defined in ApObs.obj 

Si yo BOOST_LIB_DIAGNOSTIC activar las antiguas listas de construcción:

linking to lib file: libboost_thread-vc71-mt-gd-1_35.lib 

y

linking to lib file: libboost_thread-vc71-mt-gd-1_43.lib 

Así que no chan ge allí con la que la biblioteca está vinculada

El mensaje de error completo es:

libboost_thread-vc71-mt-gd-1_43.lib(tss_pe.obj) : error LNK2005: __pRawDllMain already defined in ApObs.obj 

he hecho un diff en tss_pe.cpp en ambas versiones de la biblioteca y son idénticos, así que no estoy seguro de lo que el el problema es.

Puede hacer que desaparezca el mensaje definiendo BOOST_THREAD_USE_DLL, pero luego tendríamos que enviar BOOST_THREAD-VC71-MT-GD-1_43.DLL, así que no creo que esta sea la mejor solución.

+0

usted menciona dos veces 1,36, b ut la salida del enlazador dice 1.35? –

+0

Gracias, corregido –

Respuesta

0

Esto sucede debido a la orden de enlace.
Puede cambiar el error de vinculación agregando manualmente las librerías en Dependencias Adicionales.
En mi caso poniendo libboost_thread-vc71-mt-gd-1_43.lib antes que el otro lib conflicto resuelto el problema:

Proyecto -> Propiedades -> Propiedades de configuración -> Enlazador -> Entrada -> Dependencias adicionales

libboost_thread-VC80-mt-1_40.lib; mfcs80u.lib;% (AdditionalDependencies)

Tenga en cuenta que en mi caso fue en conflicto con mfcs80u.lib

+0

Ya no estoy en esa compañía, y creo que al final simplemente cambiaron a la versión DLL, pero creo que su respuesta es correcta, así que lo marcaré como tal –

1

Existe una incompatibilidad conocida entre MFC y el subproceso de refuerzo enlazado estáticamente, ambos intentando conectarse a DllMain para inicializar cosas. Esto ha sido introducido en boost 1.37.

From the author of boost::thread:

If you can ensure that on_process_exit from boost/thread/detail/tss_hooks.hpp is called when the DLL is unloaded then you can patch libs/thread/src/win32/tss_pe.cpp to remove the use of _pRawDllMain.

(Se recomienda utilizar la versión de DLL, sin embargo.)

No parece haber habido efforts para hacer de este parche innecesario, pero al parecer sin éxito hasta el momento ...

+0

Comenzando con Boost 1.52 [esto es posible] (http://stackoverflow.com/a/34769235/1969455). –

Cuestiones relacionadas