2009-04-05 11 views
8

Visual Studio 2005 대신 사용자 공간 응용 프로그램을 빌드하는 데 Windows Driver Kit (WinDDK 6001.18001)을 사용하고 있습니다. 드라이버 구성 요소를 만들어야하기 때문에이 방법을 사용하고 있습니다. 따라서 단일 빌드 환경을 가지고 싶습니다. 모든 것을 만들어라. Microsoft는이 방법을 여러 제품에 사용합니다.응용 프로그램의 WDK 빌드 환경에서 향상 기능을 사용하고 있습니까?

부스트 1.38.0을 사용하기 전까지는 정상적으로 작동했습니다. 커널 모드 구성 요소에서 C++을 사용하지 않고 userspace 응용 프로그램 만 사용합니다. C++ 코드에서는 부스트 라이브러리를 사용하는 것이 당연합니다. 아쉽게도 WDK는 동의하지 않습니다.

내가주의 첫 번째 오류는 "#INCLUDE < > cstddef"boost\lambda\detail\operator_return_type_traits.hpp에 몇 가지 오류를이 문제를 해결 근무 부록 D.에 필요한 왼쪽 보인다 대한 error C2976: 'std::basic_string' : too few template arguments. 그것은 iostream과 중복 표시, std 네임 스페이스에 ptrdiff_t을 두지 않는다는 것입니다 .

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

답변

1

흥미로운 질문을. STL을 그대로 사용하는 것은 WDK 자체의 문제였습니다. 나는 그 이상으로 모험하지 않았다. 나는 이것을 시도해 볼 수있다. WDK에는 VS2005/VS2008 컴파일러와 다른 컴파일러가 있습니다 (버전 번호 확인). 여기 저기에 몇 가지 버그가있을 가능성이 큽니다.

참고 : USE_MSVCRT=1USE_STL=1은 (적어도 WDK 6001의 경우) 잘 겔화되지 않았습니다.

+0

경험을 공유해 주셔서 감사합니다. msvcrt 대신 USE_LIBCMT = 1을 사용해 보았지만 문제가 남아있었습니다. STL조차도 문제가 있다는 것을 감안할 때 WDK를 다시 생각해야 할 것입니다. –

+0

우리는 VS200x 및 우리의 app 부분을 WDK로만 빌드합니다. 참고로, ddkbuild 유틸리티는 명령 줄 인수에 대한 래퍼 배치 파일이며 (필자는 항상 사용합니다) 컴파일러 문제를 정렬하는 데는 도움이되지 않습니다. – dirkgently

+0

ddkbuild를 사용하여 드라이버를 만들고 표준 vs 프로젝트를 사용하여 응용 프로그램을 빌드 할 것을 제안했습니다. 프로젝트 (드라이버) 중 하나가 ddkbuild를 사용하여 사용자 정의 빌드로 빌드하고 두 번째 (부스트)가 표준 빌드를 작성하는 솔루션을 갖게됩니다. – Ilya

0

나는 다른 방법, 즉 this (ddkbuild) 좋은 도구를 사용하여 VS200.x에서 드라이버를 컴파일하는 것이 좋습니다.

자신을 커맨드 라인 사용자로 만들고 가능한 모든 곳에서 makefile을 사용하여 복잡한 프로젝트에 유용하지 않은 빌드 유틸리티를 찾을 수 있습니다. MS 빌드 유틸리티 내에서 많은 제한이 있으며 VS 환경을 사용하여 프로젝트를 컴파일 할 것을 권장합니다.

ddkbuild에 howto가 있는지 확실하지 않지만 ddkbuild.bat를 VS 사용자 정의 빌드 옵션에 통합하는 것은 간단합니다.

+0

감사합니다. 아마이 길로 갈 것입니다. –

+1

IMMHO, ddkbuild는 컴파일 오류가 발생했을 때 거의 도움이되지 않습니다. – dirkgently

+0

100 % 확신 할 수는 없지만 VS 로그에 오류 및 경고를 표시하는 것이 가능하다고 생각합니다. 그러나 명령 행에서 빌드를 사용하는 것과 같은 방식으로 오류를 보려면 로그 파일을 열어야합니다. – Ilya

1

Boost에는 문제에 대한 해결 방법이 이미 포함되어있을 수 있지만 사용중인 컴파일러를 인식하지 못하기 때문에 적용하지 않습니다 (드라이버에서 자주 부스트를 사용하지 않기 때문일 수 있음).

boost/config/select_compiler_config.hppboost/config/compiler/visualc.hpp을 검사하여 MSVC의 컴파일러 해결 방법을 사용하도록 설정하십시오.