8

我正在使用 Windows 驱动程序工具包 (WinDDK 6001.18001) 来构建我的用户空间应用程序,而不是 Visual Studio 2005。我采用这种方法是因为我们还必须构建驱动程序组件,所以我希望有一个单一的构建环境来构建一切. Microsoft 本身将这种方法用于多种产品。

在我开始使用 Boost 1.38.0 之前,这一切正常。我没有在内核模式组件中使用 C++,只是在用户空间应用程序中使用。在 C++ 代码中,使用 boost 库是很自然的。不幸的是,WDK 不同意。

我注意到的第一个错误是“#include <cstddef>”没有ptrdiff_t按照附件 D 的要求放入 std 命名空间。解决这个问题在boost\lambda\detail\operator_return_type_traits.hppabout中留下了几个错误,error C2976: 'std::basic_string' : too few template arguments.它似乎与 iostream 是多余的。

有没有人成功地将 Boost、iostream 和 WDK 组合在一起工作?

我的源文件:

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

服务.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;
}
4

3 回答 3

1

Interesting question. Using STL as-is was a challenge in itself with the WDK. I have not ventured beyond. I can give this a try. Remember, the WDK has it's own compiler which is not the same as your VS2005/VS2008 complier (check the version numbers). It is highly likely there are a few bugs here and there.

Note, that USE_MSVCRT=1 and USE_STL=1 didn't gel well (at least for WDK 6001).

于 2009-04-05T07:22:10.463 回答
1

Boost 可能已经包含解决您的问题的方法,但没有应用它,因为它无法识别您正在使用的编译器(可能是因为驱动程序很少使用 boost)。

尝试检查(并可能进行编辑)boost/config/select_compiler_config.hppboost/config/compiler/visualc.hpp确保启用了 MSVC 的编译器解决方法。

于 2009-12-07T11:58:30.067 回答
0

我建议采用不同的方式,即使用这个(ddkbuild) 好工具从 VS200.x 编译驱动程序。

作为一个命令行人员并且在任何地方都使用 makefile,我发现构建实用程序对复杂的项目没有用。MS 构建实用程序有很多限制,我建议使用 VS 环境来编译你的项目。

我不确定 ddkbuild 中是否有 howto,但是直接将 ddkbuild.bat 集成到 VS 自定义构建选项中。

于 2009-04-05T17:40:04.973 回答