【问题标题】:How to set CMAKE_TOOLCHAIN_FILE for when the project is created on windows only仅在 Windows 上创建项目时如何设置 CMAKE_TOOLCHAIN_FILE
【发布时间】:2020-06-30 19:07:04
【问题描述】:

当 CMake 也用于 Linux 构建时,我正在尝试将 vcpkg 用于 Windows 构建。 Linux 版本不使用 vcpkg。

这是适用于 Windows 的 CMake 的一部分:

cmake_minimum_required(VERSION 3.5)
file(TO_CMAKE_PATH $ENV{LOCAL_ROOT} LOCAL_ROOT)
set(VCPKG_ROOT "${LOCAL_ROOT}/vcpkg-master")
set(CMAKE_TOOLCHAIN_FILE "${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" CACHE STRING "")
set(VCPKG_TARGET_TRIPLET "x64-windows-static" CACHE STRING "")
OPTION(USE_BOOST "use BOOST library" ON)
OPTION(CREATE_DLL "Create DLL or .so library" OFF)
OPTION(READ_GIT_HASH "read git sha1 hash for versioning" OFF)
project(ExtractOnctData)
if(MSVC)
   add_definitions (-D_USE_MATH_DEFINES)
   add_definitions (-DNOMINMAX)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP ")
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}  /MTd" )
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Ot /openmp /MT" )
else(MSVC)
    #Use C++11
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
    #Find and use standard libraries
    find_package(Threads REQUIRED)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
endif(MSVC)

但它会破坏 Linux 构建,因为将 Linux 构建中未使用的三个 vcpkg 设置添加到 CMake。

如果我这样做:

cmake_minimum_required(VERSION 3.5)
if(MSVC)
    file(TO_CMAKE_PATH $ENV{LOCAL_ROOT} LOCAL_ROOT)
    set(VCPKG_ROOT "${LOCAL_ROOT}/vcpkg-master")
    set(CMAKE_TOOLCHAIN_FILE "${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" CACHE STRING "")
    set(VCPKG_TARGET_TRIPLET "x64-windows-static" CACHE STRING "")
endif(MSVC)
OPTION(USE_BOOST "use BOOST library" ON)
OPTION(CREATE_DLL "Create DLL or .so library" OFF)
OPTION(READ_GIT_HASH "read git sha1 hash for versioning" OFF)
project(ExtractOnctData)
if(MSVC)
   add_definitions (-D_USE_MATH_DEFINES)
   add_definitions (-DNOMINMAX)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP ")
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}  /MTd" )
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Ot /openmp /MT" )
else(MSVC)
    #Use C++11
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
    #Find and use standard libraries
    find_package(Threads REQUIRED)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
endif(MSVC)

那么在Windows下就不行了。

如果我这样做:

cmake_minimum_required(VERSION 3.5)
OPTION(USE_BOOST "use BOOST library" ON)
OPTION(CREATE_DLL "Create DLL or .so library" OFF)
OPTION(READ_GIT_HASH "read git sha1 hash for versioning" OFF)
project(ExtractOnctData)
if(MSVC)
    file(TO_CMAKE_PATH $ENV{LOCAL_ROOT} LOCAL_ROOT)
    set(VCPKG_ROOT "${LOCAL_ROOT}/vcpkg-master")
    set(CMAKE_TOOLCHAIN_FILE "${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" CACHE STRING "")
    set(VCPKG_TARGET_TRIPLET "x64-windows-static" CACHE STRING "")
endif(MSVC)
if(MSVC)
   add_definitions (-D_USE_MATH_DEFINES)
   add_definitions (-DNOMINMAX)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP ")
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}  /MTd" )
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Ot /openmp /MT" )
else(MSVC)
    #Use C++11
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
    #Find and use standard libraries
    find_package(Threads REQUIRED)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
endif(MSVC)

它在 Windows 中不起作用。

我该如何解决这个问题?

【问题讨论】:

  • 您是否尝试过改用if(WIN32)?看到这个response

标签: cmake vcpkg


【解决方案1】:

一些事情:

  1. 你想在你的project(ExtractOnctData)call 之前定义CMAKE_TOOLCHAIN_FILEVCPKG_TARGET_TRIPLET(所以第三个例子永远不会起作用)
  2. 您想使用if(WIN32)(目标系统)或if(CMAKE_HOST_WIN32) 而不是if(MSVC)if(MSVC) 是编译器检查,而不是主机/目标系统检查。
  3. 删除OPTION(CREATE_DLL "Create DLL or .so library" OFF)。这应该由BUILD_SHARED_LIBS (https://cmake.org/cmake/help/v3.17/variable/BUILD_SHARED_LIBS.html) 控制。如果允许构建 DLL,请确保在 Windows 上正确导出函数
  4. find_package(Threads REQUIRED) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")。而是链接目标 Threads::Threads,您可以将其移出 if。
  5. 请不要在 Windows 上将 /MT(d) 添加到 CMAKE_CXX_FLAGS_(DEBUG|RELEASE)
  6. 不要添加-std=c++11,而是使用target_compile_features (https://cmake.org/cmake/help/v3.17/manual/cmake-compile-features.7.html#compile-feature-requirements)。也许添加一个 compiler_(flag|requirements) 接口目标,用于设置所有这些标志

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    相关资源
    最近更新 更多