2012-03-16 21 views
14

Ive thêm một số chức năng từ tăng :: ASIO, mà đã kết tủa một số trình biên dịch "cảnh báo":phát hiện Phiến đá ở cmake

Hãy xác định _WIN32_WINNT hoặc _WIN32_WINDOWS một cách thích hợp.

Vấn đề đó đã được xử lý với here. Những gì tôi muốn làm là CMake phát hiện khi tôi đang xây dựng trên các cửa sổ và thực hiện các định nghĩa thích hợp hoặc các đối số dòng lệnh.

+0

Tìm thấy một chút mỏ vàng trên wiki cmake: http://www.cmake.org/Wiki/CMake_Useful_Variables .. – 2NinerRomeo

Trả lời

19

Đây là một giải pháp đơn giản.

macro(get_WIN32_WINNT version) 
    if (WIN32 AND CMAKE_SYSTEM_VERSION) 
     set(ver ${CMAKE_SYSTEM_VERSION}) 
     string(REPLACE "." "" ver ${ver}) 
     string(REGEX REPLACE "([0-9])" "0\\1" ver ${ver}) 

     set(${version} "0x${ver}") 
    endif() 
endmacro() 

get_WIN32_WINNT(ver) 
add_definitions(-D_WIN32_WINNT=${ver}) 
+0

đẹp và đơn giản! +1 –

+0

nếu (WIN32) nếu đúng ngay cả khi bạn đang biên dịch dưới Windows cho một cái gì đó khác với Windows. Bạn sẽ kết thúc với -D_WIN32_WINNT ngay cả khi bạn đang xây dựng cho một thứ khác. – robUx4

+2

Đối với các sự cố của Windows 10, chẳng hạn như 'Windows Kits \ 8.1 \ Include \ shared \ sdkddkver.h (255): lỗi C2177: hằng số quá lớn', hãy kiểm tra câu trả lời @squareskittles' bên dưới. – Tarc

17

Bên trong CMakeLists.txt nộp bạn có thể làm:

IF (WIN32) 
    # set stuff for windows 
ELSE() 
    # set stuff for other systems 
ENDIF() 
+0

Đó là partway đó, tôi đang chọc xung quanh cho làm thế nào để xác định định nghĩa Preprocessor và biên dịch dòng lệnh cờ. Tôi nghĩ cú pháp của trình liên kết giống như tập hợp này (CMAKE_EXE_LINK_FLAGS "$ {CMAKE_EXE_LINK_FLAGS} -linkerflag") 'vì vậy tôi mong đợi nó sẽ tương tự như các cờ trình biên dịch. Tôi cũng chưa học cách thêm định nghĩa tiền xử lý. – 2NinerRomeo

4

Như karlphilip chỉ ra, bạn có thể sử dụng để phát hiện if(WIN32) nền tảng.

Bạn sẽ có một số khả năng đi qua tiền xử lý định nghĩa cho các ứng dụng:

  • Sử dụng một tiêu đề cấu hình đó được xử lý trước bằng CMake của configure_file. Cách tiếp cận này có lợi thế là tất cả #define s thực sự là một phần của mã và không phải của môi trường xây dựng. Điểm bất lợi là nó yêu cầu một bước tiền xử lý (tự động) bằng CMake
  • Sử dụng add_definitions. Điều này sẽ thêm cờ tiền xử lý cho tất cả các tệp nguồn trong dự án, do đó, đó là cách tiếp cận nhanh chóng và dơ bẩn hơn.
  • Sử dụng thuộc tính COMPILE_DEFINITIONS. Điều này cho phép kiểm soát hạt mịn trong định nghĩa trên mỗi tập tin (và thậm chí mỗi config) cơ sở: set_property(SOURCE ${YOUR_SOURCE_FILES} APPEND PROPERTY COMPILE_DEFINITIONS YOUR_FLAG1 YOUR_FLAG2)

    Trong các phiên bản CMake hiện đại (2.8.12 và cao hơn), bạn cũng có thể sử dụng thuận tiện hơn target_compile_definitions lệnh cho điều này .

Tôi thường thích cái sau, nhưng đó chủ yếu là vấn đề sở thích cá nhân.

-3

Đây là những gì tôi đã đưa ra:

if(${WIN32}) 
#this method adds the necessary compiler flag 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_WIN32_WINNT=0x0501") 
#this adds a preprocessor definition to the project 
add_definitions(-D_WIN32_WINNT=0x0501) 
endif() 

Đối phó với tăng :: ASIO "cảnh báo" một trong hai định nghĩa preprocessor hoặc cờ dòng lệnh được công việc làm.

+0

Điều này là sai. Bạn đang thêm '_WIN32_WINNT' xác định hai lần và bạn cũng đang sửa chữa phiên bản Windows tại XP. – cmannett85

+0

Cảm ơn. Tôi rất vui vì những người khác đã đưa ra các giải pháp vượt trội kể từ khi tôi đăng câu hỏi này. Vì bạn đã chú ý đến nó, tôi đã thay đổi câu trả lời được chấp nhận của mình. – 2NinerRomeo

1

Một phiên bản cải tiến của KneLLs trả lời:

macro(get_WIN32_WINNT version) 
    if (WIN32 AND CMAKE_SYSTEM_VERSION) 
     set(ver ${CMAKE_SYSTEM_VERSION}) 
     string(REGEX REPLACE "^([0-9])[.]([0-9]).*" "0\\10\\2" ver ${ver}) 
     set(${version} "0x${ver}") 
    endif() 
endmacro() 

get_WIN32_WINNT(ver) 
add_definitions(-D_WIN32_WINNT=${ver}) 

KneLLs phiên bản đã không làm việc trong trường hợp của tôi, bởi vì CMAKE_SYSTEM_VERSION6.3.9600 mà dẫn đến ${ver}=0x060306090000

Phiên bản này sẽ thất bại dành cho Windows 10 và sau đó, mặc dù. Người ta phải kiểm tra xem số đầu tiên có lớn hơn 9 và chuyển nó thành giá trị thập lục phân chính xác hay không.

8

Đây là phiên bản mở rộng của câu trả lời của KneLL, cũng kiểm tra cho Windows 10.

if (WIN32) 
    macro(get_WIN32_WINNT version) 
     if (CMAKE_SYSTEM_VERSION) 
      set(ver ${CMAKE_SYSTEM_VERSION}) 
      string(REGEX MATCH "^([0-9]+).([0-9])" ver ${ver}) 
      string(REGEX MATCH "^([0-9]+)" verMajor ${ver}) 
      # Check for Windows 10, b/c we'll need to convert to hex 'A'. 
      if ("${verMajor}" MATCHES "10") 
       set(verMajor "A") 
       string(REGEX REPLACE "^([0-9]+)" ${verMajor} ver ${ver}) 
      endif ("${verMajor}" MATCHES "10") 
      # Remove all remaining '.' characters. 
      string(REPLACE "." "" ver ${ver}) 
      # Prepend each digit with a zero. 
      string(REGEX REPLACE "([0-9A-Z])" "0\\1" ver ${ver}) 
      set(${version} "0x${ver}") 
     endif(CMAKE_SYSTEM_VERSION) 
    endmacro(get_WIN32_WINNT) 

    get_WIN32_WINNT(ver) 
    add_definitions(-D_WIN32_WINNT=${ver}) 
endif(WIN32) 
+1

Tôi có thể xác nhận điều này làm việc cho Windows 10 (đã sử dụng @ KneLL's nhưng nó đã bị hỏng khi tôi cập nhật hệ thống của tôi). – Tarc

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