仅在windows上创建项目时,如何设置CMAKE_工具链_文件

仅在windows上创建项目时,如何设置CMAKE_工具链_文件,cmake,vcpkg,Cmake,Vcpkg,当CMake也用于Linux构建时,我尝试使用vcpkg for 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_ROO

当CMake也用于Linux构建时,我尝试使用vcpkg for 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构建,因为在CMake中添加了三个在Linux构建中未使用的vcpkg设置

如果我这样做:

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)
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中就不起作用了

如果我这样做:

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)
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中不工作

如何解决此问题?

有几件事:

  • 在调用
    项目(ExtractOnctData)
    之前,您需要定义
    CMAKE\u TOOLCHAIN\u文件
    VCPKG\u TARGET\u三元组
  • 您希望使用
    if(WIN32)
    (目标系统)或
    if(CMAKE\u HOST\u WIN32)
    而不是
    if(MSVC)
    <代码>如果(MSVC)
    是编译器检查,而不是主机/目标系统检查
  • 删除
    选项(创建DLL“创建DLL或.so库”关闭)
    。这应该由
    BUILD\u SHARED\u LIBS
    ()控制。如果允许DLL生成,请确保在Windows上正确导出函数
  • find_包(需要线程)集(CMAKE_CXX_标志“${CMAKE_CXX_标志}-pthread”)
    。链接目标线程::线程,您可以将其移出if
  • 请不要在Windows上将
    /MT(d)
    添加到
    CMAKE\u CXX\u FLAGS\u(DEBUG | RELEASE)
  • 不要添加
    -std=c++11
    而是使用
    target\u compile\u功能()。可能会添加一个编译器(flag | requirements)接口目标,用于设置所有这些标志
  • 您是否尝试过改用
    if(WIN32)
    ?看这个。