2009-04-05 10 views
8

Sto utilizzando Windows Driver Kit (WinDDK 6001.18001) per creare la mia applicazione userspace anziché Visual Studio 2005. Sto adottando questo approccio perché dobbiamo anche creare componenti driver, quindi preferirei avere un singolo ambiente di build per costruisci tutto. Microsoft stessa utilizza questo approccio per diversi prodotti.Uso di boost nell'ambiente di compilazione WDK per le applicazioni?

Questo funzionava bene fino a quando non ho iniziato a utilizzare Boost 1.38.0. Non sto usando C++ nei componenti della modalità kernel, solo le applicazioni userspace. Nel codice C++, è naturale usare le librerie di boost. Sfortunatamente, il WDK non è d'accordo.

Il primo errore che ho notato è che "# include <cstddef>" non mette ptrdiff_t nel namespace std, come sembra richieste nell'allegato D. Lavorando intorno a questa data diversi errori in boost\lambda\detail\operator_return_type_traits.hpp circa error C2976: 'std::basic_string' : too few template arguments. Sembra ridondante con iostream .

Qualcuno ha ottenuto con successo la combinazione di Boost, iostream e WDK per lavorare insieme? il file

Le mie fonti:

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; 
} 

risposta

1

Domanda interessante. L'utilizzo di STL as-is è stato di per sé una sfida con il WDK. Non mi sono avventurato oltre. Posso provare. Ricorda, il WDK ha il proprio compilatore che non è lo stesso del tuo compilatore VS2005/VS2008 (controlla i numeri di versione). È molto probabile che ci siano alcuni bug qua e là.

Nota, che USE_MSVCRT=1 e USE_STL=1 non gel bene (almeno per WDK 6001).

+0

Grazie per aver condiviso la tua esperienza. Ho provato a utilizzare USE_LIBCMT = 1 invece di msvcrt, ma i problemi sono rimasti. Dato che anche STL è problematico, dovrò riconsiderare l'utilizzo del WDK. –

+0

Costruiamo la nostra parte dell'app w/VS200x e il driver solo con WDK. Nota: l'utilità ddkbuild è solo un file batch wrapper sugli argomenti della riga di comando (lo uso sempre) e probabilmente non aiuterà a risolvere i problemi del compilatore. – dirkgently

+0

Ho suggerito di utilizzare ddkbuild per creare driver e utilizzare il progetto standard vs per creare l'applicazione. Avrai una soluzione in base alla quale uno dei progetti (driver) verrà creato con la build personalizzata usando ddkbuild e il secondo (Boost) sarà costruito in modo standard. – Ilya

0

Suggerirei di andare in modo diverso, cioè di compilare il driver da VS200.x usando lo strumento this (ddkbuild).

Essendo io stesso una persona da riga di comando e utilizzando makefile ovunque possibile, trovo che l'utilità di compilazione non sia utile per progetti complessi. Ci sono tonnellate di limiti all'interno dell'utilità di creazione di MS e consiglierei di utilizzare l'ambiente VS per compilare il progetto.

Non sono sicuro che esista un howto in ddkbuild, ma è semplice integrare ddkbuild.bat nell'opzione di creazione personalizzata VS.

+0

Grazie, probabilmente andrò su questa strada. –

+1

IMMHO, il ddkbuild è di scarso aiuto quando si verifica un errore di compilazione. – dirkgently

+0

Non sono sicuro al 100%, ma penso che sia possibile visualizzare gli errori e gli avvisi nel log VS, ma in qualsiasi modo è come utilizzare build da riga di comando è necessario aprire i file di registro per vedere gli errori. – Ilya

1

Boost potrebbe già includere un work-around per i tuoi problemi, ma non lo sta applicando perché non riconosce il compilatore che stai usando (probabilmente perché i driver usano raramente boost).

Provare ad esaminare (ed eventualmente modificare) boost/config/select_compiler_config.hpp e boost/config/compiler/visualc.hpp per assicurarsi che i metodi di aggancio del compilatore per MSVC siano abilitati.