【问题标题】:Using boost in WDK build environment for applications?在应用程序的 WDK 构建环境中使用 boost?
【发布时间】:2010-10-17 15:03:04
【问题描述】:

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

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

我注意到的第一个错误是“#include ”没有按照附件 D 的要求将 ptrdiff_t 放入 std 命名空间中。解决这个问题在 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;
}

【问题讨论】:

    标签: boost kernel driver iostream wdk


    【解决方案1】:

    有趣的问题。对于 WDK,按原样使用 STL 本身就是一个挑战。我没有冒险超越。我可以试试这个。请记住,WDK 有自己的编译器,它与您的 VS2005/VS2008 编译器不同(检查版本号)。这里和那里很可能存在一些错误。

    请注意,USE_MSVCRT=1 和 USE_STL=1 不能很好地凝胶化(至少对于 WDK 6001)。

    【讨论】:

    • 感谢您分享您的经验。我尝试使用 USE_LIBCMT=1 而不是 msvcrt,但问题仍然存在。鉴于即使 STL 也存在问题,我将不得不重新考虑使用 WDK。
    • 我们使用 VS200x 构建我们的应用程序部分,并且仅使用 WDK 驱动程序。请注意,ddkbuild 实用程序只是命令行参数的包装批处理文件(我一直使用它),它可能无助于解决编译器问题。
    • 我建议使用 ddkbuild 构建驱动程序并使用标准 vs 项目来构建应用程序。您将有一个解决方案,其中一个项目(驱动程序)将使用 ddkbuild 使用自定义构建进行构建,而第二个项目(Boost)将是构建标准方式。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      我自己是一个命令行人员并尽可能使用 makefile,我发现构建实用程序对复杂项目没有用处。MS 构建实用程序有很多限制,我建议使用 VS 环境来编译您的项目。

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

      【讨论】:

      • 谢谢,我可能会走这条路。
      • 恕我直言,当您遇到编译错误时,ddkbuild 帮助不大。
      • 我不是 100% 确定,但我认为可以在 VS 日志中显示错误和警告,但无论如何它与从命令行使用构建相同,您需要打开日志文件才能查看错误。
      • @Ilya:默认情况下,它会像使用任何自定义构建工具一样显示输出。但是,您不会获得“点击转到错误行”功能或一组错误等。如果您愿意多做一点,是的,即使这样也是可能的。
      • 如果您选择不加倍努力(像我一样:)),您仍然比纯命令行构建处于更好的位置,即驱动程序的情况不会更糟,而用户模式的情况要好得多应用程序。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多