2010-04-17 26 views
9

Actualmente tengo un proyecto de consola que crea un archivo .exe; También quiero que cree un archivo .lib para que otros proyectos, compilados como DLL, puedan invocar funciones del proyecto original.¿Cómo creo un archivo .lib y un archivo .exe en Visual C++?

Yo sé que es posible, pero no pudo encontrar la manera de hacer eso. ¿Cómo le digo al vinculador que también vincule un archivo .lib?

Respuesta

8

No es posible, en general, - las bibliotecas estáticas y ejecutables son completamente diferentes tipos de animales. La forma de manejar esta situación es crear dos proyectos, uno para la biblioteca, que contiene toda la funcionalidad. y uno para el ejecutable, que es un envoltorio delgado que simplemente llama a funciones en la biblioteca.

+0

Pero aquí tengo un archivo vcproj que termina con tanto un exe y una lib ... sin embargo, para la vida de mí no pude encontrar lo que hizo hace eso. http://svn.corecraft.org/aspire_mirror/trunk/win/VC90/hearthstone-world.vcproj – MoshiBin

+0

@Spidey Es de suponer que el proyecto contiene dos sub-proyectos. –

+0

de acuerdo. Haga que el proyecto exe dependa del proyecto lib y se recompilará automáticamente cuando sea necesario. –

0

No "vincula también una lib", crea un proyecto de biblioteca estática. Este último no llama al engarzador en absoluto, sino que compila todos sus archivos con cl /c y combina los .obj resultantes en una lib utilizando lib.exe.

2

Si cualquier símbolo en un proyecto de aplicación (.exe) se exporta (por ejemplo, con __declspec (dllexport)), se generarán tanto el .exe y los archivos .lib Ver: Why does my Visual C++ .exe project build create .lib and .exp files?

+0

Esto es correcto w.r.t. la pregunta en el título.Sin embargo, ¿cómo ayudaría esto con la otra pregunta en el cuerpo? "ser capaz de llamar a funciones del proyecto [EXE] original"? – MSalters

+0

Se vincula con el archivo .lib generado; el .exe se comporta como una DLL. es decir, los símbolos se cargan en tiempo de ejecución desde .exe. –

+0

Probé lo que escribí en el último comentario. A veces funciona y algunas veces no con, un error "No se puede inicializar la aplicación (0xC0000005)". Usando LoadLibrary y GetProcAddress también termino con problemas de memoria. Entonces, en realidad, no sé cómo usar el archivo .lib generado correctamente. –

11

publicar esto solo como referencia, sé que la publicación original se publicó hace mucho tiempo, pero esto todavía se aplica a cualquier persona que necesite una solución a este problema.

Ir al proyecto que quieren hacer un archivo .lib para y siga estos pasos:

  1. Haga clic derecho sobre el proyecto.
  2. Seleccione Propiedades.
  3. Seleccione Crear eventos.
  4. Seleccionar evento de enlace previo.
  5. Por último, en la línea de comandos pega este:

    @ECHO ON @ECHO "$(VC_ExecutablePath_x86)\lib.exe" /out:"$(OutDir)$(ProjectName).lib" "$(IntermediateOutputPath)*.obj" "$(VC_ExecutablePath_x86)\lib.exe" /out:"$(OutDir)$(ProjectName).lib" "$(IntermediateOutputPath)*.obj"

Para ello, será la herramienta lib para generar el archivo lib de los ficheros objeto generados.

+0

Algo tarde, pero quería agradecerte de todos modos :) Acabas de hacer mi vida mucho más fácil –

+0

De nada. ;) –

+0

En mi caso, la ubicación predeterminada para .obj estaba en la carpeta del proyecto, así que cambié "$ (IntermediateOutputPath) *. Obj" a "$ (SolutionDir) $ (ProjectName) \ $ (Configuration) \ *. Obj" . funciona bien, gracias. – elarmando

0

Es asombroso cuántos contribuidores insisten arrogantemente en una respuesta que es incorrecta, cuando ellos simplemente no saben la respuesta.

Para generar un .lib asociada a su lugar .exe la siguiente línea en Pre-Link Evento:

"$ (VC_ExecutablePath_x86) \ lib.exe" de entrada/salida: "$ (OutDir) $ (Nombre del Proyecto) lib" '$ (IntermediateOutputPath) *. obj'

+0

Esta técnica parece funcionar solo en el modo de depuración. – user6664090

Cuestiones relacionadas