2009-04-05 11 views
8

Estoy usando el Windows Driver Kit (WinDDK 6001.18001) para construir mi aplicación de espacio de usuario en lugar de Visual Studio 2005. Estoy tomando este enfoque porque también tenemos que crear componentes de controladores, por lo que preferiría tener un único entorno de compilación para construir todo. Microsoft mismo usa este enfoque para varios productos.¿Cómo usar el impulso en el entorno de compilación WDK para las aplicaciones?

Esto funcionaba bien hasta que comencé a usar Boost 1.38.0. No estoy usando C++ en los componentes del modo kernel, solo las aplicaciones de espacio de usuario. En el código C++, es natural usar las bibliotecas de impulso. Desafortunadamente, el WDK no está de acuerdo.

El primer error que he notado es que "# include <cstddef>" no pone ptrdiff_t en el espacio de nombres std, como parece estipulada en el anexo D. El trabajo en torno a esta dejado varios errores en boost\lambda\detail\operator_return_type_traits.hpp sobre error C2976: 'std::basic_string' : too few template arguments. Parece redundante con iostream .

¿Alguien ha conseguido con éxito la combinación de Boost, iostream y WDK para trabajar juntos? presentar

Mis fuentes:

TARGETNAME=foobar 
TARGETTYPE=PROGRAM 

USE_MSVCRT = 1 
USE_STL = 1 
USE_ATL = 1 
ATL_VER = 30 
STL_VER = 70 
USE_NATIVE_EH = 1 
USE_IOSTREAM = 1 

SUBSYSTEM_VERSION = 5.02 

C_DEFINES = \ 
    -D_MT \ 
    -DWIN_32 \ 
    -DWIN32 \ 
    -D_WINDOWS \ 
    -DNT \ 
    -D_WIN32_DCOM \ 
    -DUNICODE \ 
    -D_UNICODE \ 
    -D_ATL_NO_DEBUG_CRT # because we are using USE_MSVCRT=1 

SOURCES=service.cpp 

INCLUDES=\ 
    $(BOOST_INC_PATH) 

TARGETLIBS=\ 
    $(SDK_LIB_PATH)\ole32.lib \ 
    $(SDK_LIB_PATH)\oleaut32.lib \ 
    $(SDK_LIB_PATH)\uuid.lib \ 

UMTYPE=console 
UMBASE=0x400000 

service.cpp:

#include <iostream> 
#include <cstddef> 

namespace std { 
     typedef ::ptrdiff_t ptrdiff_t; // DDK C++ workaround 
} 

#include <boost/lambda/lambda.hpp> 

int __cdecl main() { 
    return 0; 
} 

Respuesta

1

pregunta interesante. El uso de STL como estaba era un desafío en sí mismo con el WDK. No me he aventurado más allá. Puedo probar esto. Recuerde, el WDK tiene su propio compilador que no es lo mismo que su compilador VS2005/VS2008 (verifique los números de versión). Es muy probable que haya algunos errores aquí y allá.

Tenga en cuenta que USE_MSVCRT=1 y USE_STL=1 no se gelificaron bien (al menos para WDK 6001).

+0

Gracias por compartir su experiencia. Intenté usar USE_LIBCMT = 1 en lugar de msvcrt, pero persistieron los problemas. Dado que incluso STL es problemático, voy a tener que reconsiderar el uso de WDK. –

+0

Construimos nuestra parte de la aplicación w/VS200x y el controlador solo con el WDK. Tenga en cuenta que la utilidad ddkbuild es solo un archivo por lotes contenedor sobre los argumentos de la línea de comandos (lo uso todo el tiempo) y probablemente no ayude a resolver los problemas del compilador. – dirkgently

+0

Sugerí usar ddkbuild para compilar driver y usar estándar vs proyecto para compilar la aplicación. Tendrá una solución que uno de los proyectos (controlador) se compilará con compilación personalizada utilizando ddkbuild y el segundo (Boost) se compilará de manera estándar. – Ilya

0

Sugeriría ir de otra manera, es decir, compilar el controlador de VS200.x utilizando la herramienta this (ddkbuild).

Siendo yo mismo una persona de línea de comando y usando makefiles donde sea posible, la utilidad de compilación no es útil para proyectos complejos. Hay una gran cantidad de limitaciones dentro de MS build utility y recomendaría usar el entorno VS para compilar su proyecto.

No estoy seguro de si hay un howto en el ddkbuild, pero es sencillo integrar ddkbuild.bat en la opción de creación personalizada VS.

+0

Gracias, probablemente seguiré esta ruta. –

+1

IMMHO, el ddkbuild es de poca ayuda cuando tiene un error de compilación. – dirkgently

+0

No estoy 100% seguro, pero creo que es posible mostrar errores y advertencias en el registro de VS, pero de cualquier forma que sea igual a usar compilación desde la línea de comandos, debe abrir los archivos de registro para ver los errores. – Ilya

1

Boost ya puede incluir una solución temporal para sus problemas, pero no la aplica porque no reconoce el compilador que está utilizando (probablemente porque los controladores rara vez usan boost).

Intente examinar (y posiblemente editar) boost/config/select_compiler_config.hpp y boost/config/compiler/visualc.hpp para asegurarse de que las soluciones provisionales del compilador para MSVC están habilitadas.

Cuestiones relacionadas