2012-08-27 11 views
9

Trabajo en el algoritmo de optimización, por lo que el rendimiento realmente importa. El algoritmo es aproximadamente 8 veces más rápido cuando se compila en VS 2010 en comparación con VS 2008. La búsqueda en Google muestra que no es mi culpa (consulte, por ejemplo, https://stackoverflow.com/a/5560184/890355). El problema es que el proyecto final debe construirse bajo VS 2008.Usar las bibliotecas de tiempo de ejecución de VC++ 2010 en el proyecto VC++ 2008

La solución que suelo es construir mi algoritmo como DLL en VS 2010 y luego vincularlo al proyecto principal. ¿Es posible utilizar las bibliotecas de tiempo de ejecución de VC++ 2010 con mi archivo DLL en VS 2008? Si es así, ¿cuál es la forma menos dolorosa de hacerlo? ¿Alguna otra idea? Gracias.

+0

El compilador de C++ utilizado por Visual Studio no es compatible C++ 0x si eso es lo que están pidiendo. Por supuesto, siempre puedes usar un compilador más reciente si quieres evitar la actualización a Visual Studio 2010 y/o Visual Studio 2012. Una posible solución es compilar el algoritmo de optimización usando un compilador diferente y solo hacer referencia al resultado creado por dicho compilador. . –

+2

¿Sus bibliotecas transfieren objetos entre sí, y esperan que cada uno los desasigne?La mezcla de bibliotecas podría funcionar, pero hay algunas advertencias bastante limitantes (y el uso de los contenedores de C++ puede conducir a una mala magia): http://stackoverflow.com/questions/6531401/how-to-use-vs2010-built-dlls-in -vs2008 - en resumen, es más fácil si puede mantener todo en consistencia y usar solo un tiempo de ejecución de C++. – birryree

+3

Esto solo puede llegar a su fin cuando utiliza los archivos #include de VS2010. Lo cual no funcionará, VS2008 no puede compilarlos, especialmente dado que está después de las mejoras en el rendimiento semántico. –

Respuesta

1

Si solicita cualquier otra forma de combinar las bibliotecas de 2008 y 2010 en un ejecutable que no sea mover 2010 parte a una DLL, entonces la respuesta es probablemente "no hay otra manera fácil de lograr esto".

Pero si no desea "bibliotecas de tiempo de ejecución de VC++ 2010 ... en VS 2008" (eso está compilando contra las bibliotecas de 2010 en IDE antiguo de 2008), sino "use una DLL 2010 compilada en su 2008 programa compilado ", es perfectamente posible.

La manera más fácil, como lo hacemos en nuestros proyectos, es compilar (tanto .exe como DLL) contra bibliotecas estándar vinculadas estáticamente (MFC, si lo usa) y luego usar LoadLibrary en su .exe para cargar el DLL. En el archivo DLL puede exportar (_declspec (dllexport)) una función (preferentemente dentro de guardias extern "C" {}) y usarla en .exe a través de GetProcAddress.

La vinculación estática y la carga explícita lo salvan de una gran cantidad de errores de inconsistencia causados ​​por diferentes tiempos de ejecución.

Si le preocupan los costos de carga DLL y llamadas funcionales, puede tratar de hacer estas llamadas lo más raras posible (tal vez moviendo no solo el algoritmo, sino también algunas lógicas de alto nivel a la DLL). Ver this issie también.

Y puede compilar todo su código en un IDE (2010) usando native multitargeting (sin embargo, aún tendrá que compilar su aplicación principal y DLL por separado contra las bibliotecas v9 y v10, respectivamente).

3

Los tiempos de ejecución no son un problema. Nada le impide vincular su DLL con el tiempo de ejecución de VC2010 y luego usar esa DLL en otros proyectos. No importa si esos proyectos se crean utilizando Visual C++ 2008 o cualquier otro idioma.

La parte difícil es diseñar la interfaz DLL. Simplemente exportar algunas clases de C++ es arriesgado ya que lo expone a incompatibilidades entre los diferentes compiladores. Creo que tu mejor opción sería exponer una interfaz tipo C o usar COM. Creo que COM es el mejor enfoque, pero si no está familiarizado con la tecnología, entonces una interfaz estilo C funcionará bien. (COM también podría ser over-kill si la interfaz es simple.)

Cuestiones relacionadas