我使用Windows驱动程序工具包(WinDDK 6001.18001)来构建我的用户空间应用程序而不是Visual Studio 2005.我采用这种方法,因为我们还必须构建驱动程序组件,所以我更喜欢有一个构建环境建立一切。微软本身将这种方法用于多种产品。
这一点工作正常,直到我开始使用Boost 1.38.0。我没有在内核模式组件中使用C ++,只是用户空间应用程序。在C ++代码中,使用boost库是很自然的。不幸的是,WDK不同意。
我注意到的第一个错误是“#include< cstddef>”没有把ptrdiff_t
放在std命名空间中,如附件D所要求的那样。解决这个问题,boost\lambda\detail\operator_return_type_traits.hpp
中有几个错误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
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;
}
答案 0 :(得分:1)
有趣的问题。使用STL本身就是WDK的挑战。我没有冒险过。我可以尝试一下。请记住,WDK拥有自己的编译器,它与VS2005 / VS2008编译器不同(请查看版本号)。这里和那里很可能有一些错误。
注意,USE_MSVCRT=1
和USE_STL=1
不能很好地凝胶化(至少对于WDK 6001而言)。
答案 1 :(得分:1)
Boost可能已经包含了解决问题的方法,但没有应用它,因为它无法识别您正在使用的编译器(可能是因为驱动程序很少使用boost)。
尝试检查(并可能编辑)boost/config/select_compiler_config.hpp
和boost/config/compiler/visualc.hpp
,以确保启用了MSVC的编译器变通方法。
答案 2 :(得分:0)
我建议采用不同的方式,即使用this(ddkbuild)漂亮工具从VS200.x编译驱动程序。
作为一名命令行人并且随处可能使用makefile,我发现构建实用程序对于复杂项目没有用。在MS构建实用程序中有很多限制,我建议使用VS环境来编译项目。
我不确定ddkbuild中是否有howto,但是直接将ddkbuild.bat集成到VS自定义构建选项中。