2017-03-11 44 views
18

From the Boost mailing danh sách Tôi hiểu rằng VS2017 có số phiên bản sau mà chúng tôi có lẽ sẽ quan tâm nhất:Version số cho Visual Studio 2017, Boost và CMake

Visual Studio   15.0 
cl; C/C++ Compiler  19.10 
Platform Toolset:  v141 

Các macro sau đây được định nghĩa trong visual Studio 2017 IDE:

CrtSDKReferenceVersion 14.0 
MSBuildToolsVersion  15.0 
PlatformToolsetVersion 141 
VCToolsVersion   14.10.25017 
VisualStudioVersion  15.0 

trong biên soạn các biến sau đây là #define 'd:

_MSC_VER    1910 
_MSC_FULL_VER   191025017 

cl.exeis contained within an MSVC folder với phiên bản công cụ VC. Hoàn chỉnh đường x64 thư mục là

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\bin\HostX64\x64 

cl /Bv từ danh sách dòng lệnh:

Compiler Passes: 
cl.exe:  Version 19.10.25017.0 
c1.dll:  Version 19.10.25017.0 
c1xx.dll:  Version 19.10.25017.0 
c2.dll:  Version 19.10.25017.0 
link.exe:  Version 14.10.25017.0 
mspdb140.dll: Version 14.10.25017.0 
1033\clui.dll: Version 19.10.25017.0 

Thông báo mspdb140.dlllink.exe được liệt kê với phiên bản 14.10.25017.0.


here dường như msvc : 14.1 nên được sử dụng làm công cụ cho tăng. Và here is another answer nơi một số nhận xét nói về cách đặt tên trình biên dịch của trình tăng.

Khi tôi biên soạn tôi nhận được tên các thư viện với v141 ví dụ .: boost_atomic-vc141-mt-1_64.lib


Nhưng trong CMake các _Boost_GUESS_COMPILER_PREFIX chức năng có sau đây:

if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 19.10) 
    set(_boost_COMPILER "-vc150") 
elseif (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 19) 
    set(_boost_COMPILER "-vc140") 

Vì vậy, phiên bản nào nên được sử dụng? vc141 hoặc vc150? Liệu

  • v141 bao hàm vc141, hoặc làm
  • v141 bao hàm vc150?
+0

'vc150' có vẻ giống như một lỗi trong' _Boost_GUESS_COMPILER_PREFIX' của CMake đối với tôi. Bạn đang sử dụng phiên bản CMake nào? Bộ công cụ của VS2017 'v141' là nhị phân tương thích với 'v140' của VS2015 và không có' v (c) 150' mà tôi đã nghe đến. Có lẽ, nhà phát triển của macro CMake đó đã ngoại suy và đoán bộ công cụ cho VS2017. –

+0

@ Torbjörn Đồng ý. Có một VC 15.0, nhưng không có Toolset 15.0 (chưa) và tên tập tin đề cập đến bộ công cụ. Tôi đang sử dụng CMake 3.8.0-rc1. – wally

+0

Nếu bạn đang sử dụng phiên bản CMake <3.8.0 (bao gồm cả phiên bản RC), bạn cần sử dụng 141. Nếu bạn đang sử dụng phiên bản CMake> 3.8.0 bạn cần sử dụng 150. Vấn đề này phải làm với cách Boost thay đổi lược đồ đánh số. – StAlphonzo

Trả lời

13

Để trả lời câu này, nó sẽ là tốt nhất để bắt đầu với

  • cách cấu trúc Microsoft sản phẩm của mình
  • những gì Microsoft gọi sản phẩm của mình và
  • cách Microsoft số họ.

Vì vậy, trên hệ thống của tôi:

Microsoft Visual Studio Community 2017 has version number 15.0.26228.4. It contains: 
| 
+--Visual C++, informally VS, informally MSVC 
    (no version number to be found, but it is reasonable to infer 15.0) 
    which uses tools, such as 
    | 
    +--Toolset v141, composed of 
     | 
     +--compiler cl.exe version 19.10.25017.0 and 
     +--linker link.exe version 14.10.25017.0 which 
     | 
     +--refers to CrtSDK version 14.0, and 
     +--uses mspdb140.dll version 14.10.25017.0 

Có vẻ như rõ ràng rằng phiên bản công cụ sẽ là tài liệu tham khảo chính. Đặc biệt nếu một người cho rằng VS 2017 có thể xây dựng cả hai với v140v141. Bộ công cụ định nghĩa gọn gàng cả trình biên dịch và trình liên kết.


Ví dụ: để biên dịch Boost với b2 toolset=msvc-14.0 chẳng hạn? Tranh luận của tôi là nó có nghĩa là toolset v140, không phải Microsoft Visual C++ 14.0.

Làm cách nào để biên dịch với toolset v141? Msvc không chính thức thường là số VS (ví dụ: 15.0 cho VS2017 trên hệ thống của tôi), nhưng điều đó sẽ không chính xác khi chỉ định một bộ công cụ. Tiếp theo, chúng tôi lưu ý rằng Boost sẽ tạo một tệp có tên là vcXXX trong đó vc một lần nữa sẽ ngụ ý khái niệm không chính thức của một số phiên bản Visual C++ chẳng hạn như 15.0 nhưng chắc chắn không thể tham chiếu đến vì đó là bộ công cụ được chỉ định.

Vì vậy, biên dịch cho bộ công cụ mới nhất trên VS2017 lệnh sẽ là b2 toolset=msvc-14.1 sẽ tạo thư viện có tên tệp có chứa vc141. Nó sẽ ít khó hiểu hơn là nó đã được v141, nhưng sau đó sẽ không có lời nhắc nhở rằng chúng ta đang đối phó với bộ công cụ của Microsoft.

bây giờ tôi nghĩ về các lệnh như sau:

b2 toolset=msvc-14.1 
      ---- ---- 
      | | 
      | +-- Toolset v141 
      | 
      +------- Microsoft Visual C++ (version 15.0) 

Cuối cùng chúng ta có thể xem xét các chức năng CMake trong FindBoost.cmake. _boost_COMPILER phải mặc định là -vc141 nếu phiên bản trình biên dịch là 19.10.

3

Phiên bản CMake ít hơn phiên bản chính thức v3.8.0, bao gồm các số rc có những điều sau đây trong FindBoost.cmake của chúng.

if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 19.10) 
    set(_boost_COMPILER "-vc150") 

có nghĩa là, nếu dll Boost của bạn không được đặt tên, ví dụ: boost_date_time- vc150 -mt-1_55.dll chúng sẽ không được tìm thấy. Phiên bản v3.8.0 bắt đầu khớp với cách tiếp cận mà Boost đang thực hiện đối với các số phiên bản, mặc dù tôi không nhớ lại cuộc thảo luận chuyên sâu về vấn đề này. Câu trả lời ngắn gọn là mặc dù, nếu bạn đang sử dụng một phiên bản cmake v3.8.0 hoặc cao hơn, bạn cần những điều sau đây để thay thế.

if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 19.10) 
    set(BOOST_TOOLSET msvc-14.1) 

Để đơn giản, trong Boost của tôi được xây dựng cho Windows, tôi luôn thêm mã CMake sau ..

if(MSVC AND (NOT MSVC_VERSION LESS 1910)) 
    # Get the CMAKE version string and make sure it's not a release candidate and >= 3.8.0 
    if((CMAKE_VERSION MATCHES "^3\\.8\\.0-rc") OR (CMAKE_VERSION VERSION_LESS 3.8.0)) 
    message(FATAL_ERROR "CMake 3.8.0 is the minimum version required to use Boost with Visual Studio 2017 or greater") 
    endif() 
endif() 

đó cho phép tôi quên đi toàn bộ vấn đề của những gì các thư viện nên được đặt tên.

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