2015-10-01 47 views
7

Với Visual Studio 2015 tôi không còn có thể biên dịch và liên kết chương trình C++ đơn giản bằng các công cụ dòng lệnh.Không thể biên dịch và liên kết chương trình C++ đơn giản với công cụ dòng lệnh Visual Studio 2015

Cân nhắc main.cpp:

#include <stdlib.h> 
int main() { return 0; } 

Trong phiên bản trước đó (ví dụ Visual Studio 2012) tôi đã có thể biên dịch và liên kết main.cpp dễ dàng:

C:\Users\bkircher\src\test>cl main.cpp 
Microsoft (R) C/C++ Optimizing Compiler Version 17.00.61030 for x64 
Copyright (C) Microsoft Corporation. All rights reserved. 

main.cpp 
Microsoft (R) Incremental Linker Version 11.00.61030.0 
Copyright (C) Microsoft Corporation. All rights reserved. 

/out:main.exe 
main.obj 

Và thực hiện.

Với Visual Studio 2015 tuy nhiên, tôi không còn phải CRT thích hợp bao gồm và đường dẫn thư viện thiết lập:

C:\Users\bkircher\src\test>cl main.cpp 
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23026 for x64 
Copyright (C) Microsoft Corporation. All rights reserved. 

main.cpp 
main.cpp(1): fatal error C1083: Cannot open include file: 'stdlib.h': No such file or directory 

Tôi hiểu rằng Microsoft phân phối thời gian chạy C như là một điều hành Windows thành phần hệ thống mới, Universal CRT.

Như đã trình bày trong Introducing the Universal CRT, tôi nên sử dụng tính MSBuild sau đây để tìm ra con đường thích hợp

$(UniversalCRT_IncludePath) 
$(UniversalCRT_LibraryPath_x64) 

Mặc dù vậy, làm thế nào để tôi nhận được thư viện phù hợp và bao gồm đường dẫn cho xây dựng các hệ thống khác hơn devenv hoặc MSBuild?

Vì lợi ích của nó:

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC>set include 
INCLUDE=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE;C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\ATLMFC\INCLUDE;C:\Program Files (x86)\Windows Kits\10\include\wdf\ucrt;C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6\include\um;C:\Program Files (x86)\Windows Kits\10\include\wdf\shared;C:\Program Files (x86)\Windows Kits\10\include\wdf\um;C:\Program Files (x86)\Windows Kits\10\include\wdf\winrt; 

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC>set lib 
LIB=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\LIB\amd64;C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\ATLMFC\LIB\amd64;C:\Program Files (x86)\Windows Kits\10\lib\wdf\ucrt\x64;C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6\lib\um\x64;C:\Program Files (x86)\Windows Kits\10\lib\wdf\um\x64; 
LIBPATH=C:\Windows\Microsoft.NET\Framework64\v4.0.30319;C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\LIB\amd64;C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\ATLMFC\LIB\amd64;C:\Program Files (x86)\Windows Kits\10\UnionMetadata;C:\Program Files (x86)\Windows Kits\10\References;C:\Program Files (x86)\Windows Kits\10\References\Windows.Foundation.UniversalApiContract\1.0.0.0;C:\Program Files (x86)\Windows Kits\10\References\Windows.Foundation.FoundationContract\1.0.0.0;C:\Program Files (x86)\Windows Kits\10\References\indows.Networking.Connectivity.WwanContract\1.0.0.0;C:\Program Files (x86)\Microsoft SDKs\Windows Kits\10\ExtensionSDKs\Microsoft.VCLibs\14.0\References\CommonConfiguration\neutral; 

Trả lời

8

Bao gồm các nội dung của các biến môi trường là một ý tưởng tốt. Dựa trên các đường dẫn xuất hiện ở đó, có vẻ như bạn đã cài đặt Windows Driver Kit và bạn đang gặp phải điều này issue reported on Connect.

Theo mô tả sự cố, thư mục wdf được tạo bởi WDK gây nhầm lẫn cho tệp bó cố gắng xác định phiên bản SDK mới nhất có sẵn. Ví dụ, thay vì

C:\Program Files (x86)\Windows Kits\10\include\wdf\ucrt 

trong biến INCLUDE, bạn nên có một cái gì đó giống như

C:\Program Files (x86)\Windows Kits\10\include\10.0.10150.0\ucrt 

Các "thảm bom" giải pháp: gỡ bỏ cài đặt WDK, đảm bảo wdf thư mục là đã biến mất và mọi thứ sẽ trở lại bình thường.


Nếu đó không phải là một lựa chọn, đây là một "phẫu thuật" Giải pháp: bạn cần phải chỉnh sửa

"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\vcvarsqueryregistry.bat" 

(sao lưu nó lên đầu tiên, tất nhiên)

1. Look cho hai nhãn sau:

:GetWindowsSdkDirHelper32 
:GetWindowsSdkDirHelper64 

Dưới mỗi trong số họ, bạn sẽ tìm thấy những dòng sau đây:

@REM Get windows 10 sdk version number 
@if not "%WindowsSdkDir%"=="" @FOR /F "delims=" %%i IN ('dir "%WindowsSdkDir%include\" /b /ad-h /on') DO @set WindowsSDKVersion=%%i\ 

Thay đổi nó để:

@REM Get windows 10 sdk version number 
@if not "%WindowsSdkDir%"=="" @FOR /F "delims=" %%i IN ('dir "%WindowsSdkDir%include\" /b /ad-h /on') DO (
    @if not "%%i"=="wdf" (
     @set WindowsSDKVersion=%%i\ 
    ) 
) 

2. Tìm hai nhãn sau:

:GetUniversalCRTSdkDirHelper32 
:GetUniversalCRTSdkDirHelper64 

Dưới mỗi trong số họ, thay đổi dòng sau:

@FOR /F "delims=" %%i IN ('dir "%UniversalCRTSdkDir%include\" /b /ad-h /on') DO @SET UCRTVersion=%%i 

tới:

@FOR /F "delims=" %%i IN ('dir "%UniversalCRTSdkDir%include\" /b /ad-h /on') DO (
    @if not "%%i"=="wdf" (
     @SET UCRTVersion=%%i 
    ) 
) 

Vậy là xong. Hãy cho tôi biết nếu nó giúp.

Hãy nhớ rằng điều này sẽ bỏ qua tất cả các thư mục wdf hoàn toàn. Nếu kịch bản lệnh thiết lập lời nhắc lệnh WDK xảy ra để sử dụng cùng một tệp hàng loạt vcvarsqueryregistry.bat (tôi nghi ngờ nó, nhưng ...), thì chúng sẽ không hoạt động chính xác nữa; sẽ cần một chút hack hơn trong trường hợp này để chọn tệp lô thích hợp cho mỗi môi trường xây dựng.

+0

Cảm ơn bạn đã liên kết và các giải pháp được cung cấp. Phân tích của bạn là chính xác. Tôi đã gỡ bỏ cài đặt Windows SDK và Windows Driver Kit và mọi thứ hoạt động như một nét duyên dáng một lần nữa –

+3

'Hãy cho tôi biết nếu nó đã giúp.' Cảm ơn, nó đã giúp w/o gỡ cài đặt WDK. – RIscRIpt

+2

Cũng lưu ý cách khắc phục được đăng trên trang web của Microsoft được liên kết trong câu trả lời ở trên. Việc ẩn thư mục wdf cũng giải quyết được vấn đề này. – patthoyts

Các vấn đề liên quan