使用CMake查找Direct3D 12 [英] Finding Direct3D 12 using CMake

查看:206
本文介绍了使用CMake查找Direct3D 12的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以我一直在尝试学习CMake并将其与C ++一起使用。我想尝试创建一个在Windows上使用 Direct3D 12 的便携式游戏引擎。



当前,我有以下 CMakeLists.txt 用于我的项目:

  cmake_minimum_required(版本3.0致命错误)

项目(PsychoEngineCore)

set(SRCS_CXX $ {CMAKE_CURRENT_LIST_DIR})

include($ {CMAKE_CURRENT_SOURCE_DIR} /src/dir_src.cmake)

set(LIB_TYPE STATIC CACHE STRING静态或动态链接)

if($ {CMAKE_CXX_COMPILER_ID} STREQUAL GNU或
$ {CMAKE_CXX_COMPILER_ID} STREQUAL Clang)$ b b $ b set(警告 -Wall -Wextra -Werror)
elseif($ {CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
set(警告 / W4 / WX / EHsc)
endif( )

if(NOT CONFIGURED_ONCE)
set(CMAKE_CXX_FLAGS $ {warnings}
CACHE STRING编译器在所有构建类型期间使用的标志。 FORCE)
endif()

include_directories($ {CMAKE_CURRENT_SOURCE_DIR} / inclu de)

#我们要静态库吗?
#当STATIC_LINKING为TRUE时,cmake将查找以 .a结尾的二进制文件。
#这仅适用于LINUX!
if(LIB_TYPE EQUIL STATIC)
if(UNIX AND NOT APPLE)
set(CMAKE_FIND_LIBRARY_SUFFIXES(。a))
endif(UNIX AND NOT APPLE)

set(CMAKE_EXE_LINKER_FLAGS -static)
set_target_properties(表面属性LINK_SEARCH_END_STATIC 1)
endif(LIB_TYPE EQUAL STATIC)

include_directories($ {CMAKE_CURRENT_SOURCE_DIR} / include)
include(GenerateExportHeader)
add_library($ {PROJECT_NAME} $ {LIB_TYPE} $ {SRCS_CXX})
GENERATE_EXPORT_HEADER(
$ {PROJECT_NAME}
EXPORT_MACRO_NAME PE_API
b EXPORT_FILE_NAME $ {CMAKE_CURRENT_SOURCE_DIR} / include / Engine / API / $ {PROJECT_NAME} Export.hpp
DEPRECATED_MACRO_NAME PE_API_DEP
STATIC_DEFINE PE_STATIC



当前,我的 d3d12.lib 文件位于以下位置:

  C:\Program Files(x86)\Windows Kits\10\Libs\10.0.16299.0\um\x64 

有办法吗保持路径动态并最好在该系统上有更新版本的情况下更新?



谢谢!

解决方案

将我的评论变成答案



通常来说,只需添加

  target_link_libraries(($$ PROJECT_NAME} d3d12.lib)

Windows SDK(其中 Direct3D SDK现在已成为的一部分)在标准搜索路径中,例如库链接器的名称。因此,它是由MSVC编译器和链接器自动找到的。



我不认为自动升级到较新的API版本是一个好主意。您正在为特定的API版本编写程序。



工作示例



这是一个最小的工作示例(已测试VS2017 15.5.5,CMake 3.9.0):

  cmake_minimum_required(版本3.0)

项目(Direct3DExample)

find_package(需要Git)

set(_path $ {CMAKE_BINARY_DIR} / DirectX- Graphics-Samples / Samples / Desktop / D3D12HelloWorld / src / HelloTriangle)
if(不存在 $ {_ path})
execute_process(
COMMAND $ {GIT_EXECUTABLE} clone https: //github.com/Microsoft/DirectX-Graphics-Samples.git

endif()

file(GLOB _files $ {_ path} / *)
list(APPEND _shader $ {_ files})
list(FILTER _files EXCLUDE REGEX \\.vcxproj | \\.hlsl)
list(FILTER _shader INCLUDE REGEX \ hl.hlsl)

get_filename_component(_name $ {_ path}名称)

add_executable($ {_ name} WIN32 $ {_ files})
target_compile_de finitions($ {_ name} PRIVATE UNICODE _UNICODE)
target_link_libraries($ {_ name} PRIVATE d3d12.lib dxgi.lib d3dcompiler.lib)

add_custom_command (
TARGET $ {_ name}
POST_BUILD
COMMAND $ {CMAKE_COMMAND} -E复制$ {_ shader} $< TARGET_FILE_DIR:$ {_ name}>

如果您需要更多(未自动找到Windows SDK的编译器/链接器, ),则可能需要查看以下 find_package()配置代码:




So I've been trying to learn CMake and use it with C++. I'd like to have a go at creating a portable game engine which uses Direct3D 12 on Windows.

Currently, I have the following CMakeLists.txt for my project:

cmake_minimum_required(VERSION 3.0 FATAL_ERROR)

project(PsychoEngineCore)

set(SRCS_CXX ${CMAKE_CURRENT_LIST_DIR})

include(${CMAKE_CURRENT_SOURCE_DIR}/src/dir_src.cmake)

set(LIB_TYPE "STATIC" CACHE STRING "Static or Dynamic Linking")

if(${CMAKE_CXX_COMPILER_ID} STREQUAL GNU OR
${CMAKE_CXX_COMPILER_ID} STREQUAL Clang)
    set(warnings "-Wall -Wextra -Werror")
elseif(${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
    set(warnings "/W4 /WX /EHsc")
endif()

if(NOT CONFIGURED_ONCE)
    set(CMAKE_CXX_FLAGS "${warnings}"
        CACHE STRING "Flags used by the compiler during all build types." FORCE)
endif()

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)

# Do we want static libraries?
# When STATIC_LINKING is TRUE, then cmake looks for binaries ending in ".a".
# THIS IS FOR LINUX ONLY!
if(LIB_TYPE EQUAL STATIC)
    if (UNIX AND NOT APPLE)
        set(CMAKE_FIND_LIBRARY_SUFFIXES(".a"))
    endif(UNIX AND NOT APPLE)

    set(CMAKE_EXE_LINKER_FLAGS "-static")
    set_target_properties(surface PROPERTIES LINK_SEARCH_END_STATIC 1)
endif(LIB_TYPE EQUAL STATIC)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
include(GenerateExportHeader)
add_library(${PROJECT_NAME} ${LIB_TYPE} ${SRCS_CXX})
GENERATE_EXPORT_HEADER(
    ${PROJECT_NAME}
    EXPORT_MACRO_NAME PE_API
    EXPORT_FILE_NAME ${CMAKE_CURRENT_SOURCE_DIR}/include/Engine/API/${PROJECT_NAME}Export.hpp
    DEPRECATED_MACRO_NAME PE_API_DEP
    STATIC_DEFINE PE_STATIC
)

Currently I have my d3d12.lib file in the following location:

C:\Program Files (x86)\Windows Kits\10\Libs\10.0.16299.0\um\x64

Is there a way to keep the path dynamic and preferably "update" if a newer version is available on said system?

Thanks!

解决方案

Turning my comment into an answer

Generally speaking, just add a

target_link_libraries((${PROJECT_NAME} d3d12.lib) 

The Windows SDK (where the Direct3D SDK is now part of) is in the standard search paths e.g. of the linker for libraries. So it's found automatically by the MSVC compiler and linker.

And I don't think that upgrading to a newer (yet unknown) API version automatically is a good idea. You're writing your program for a specific API version.

Working Example

Here is a minimal working example (Tested VS2017 15.5.5, CMake 3.9.0):

cmake_minimum_required(VERSION 3.0)

project(Direct3DExample)

find_package(Git REQUIRED)

set(_path "${CMAKE_BINARY_DIR}/DirectX-Graphics-Samples/Samples/Desktop/D3D12HelloWorld/src/HelloTriangle")
if (NOT EXISTS "${_path}")
    execute_process(
        COMMAND "${GIT_EXECUTABLE}" clone https://github.com/Microsoft/DirectX-Graphics-Samples.git
    )
endif()

file(GLOB _files "${_path}/*")
list(APPEND _shader ${_files})
list(FILTER _files EXCLUDE REGEX "\\.vcxproj|\\.hlsl")
list(FILTER _shader INCLUDE REGEX "\\.hlsl")

get_filename_component(_name "${_path}" NAME)

add_executable(${_name} WIN32 ${_files})
target_compile_definitions(${_name} PRIVATE "UNICODE" "_UNICODE")
target_link_libraries(${_name} PRIVATE "d3d12.lib" "dxgi.lib" "d3dcompiler.lib")

add_custom_command(
    TARGET ${_name}
    POST_BUILD
    COMMAND "${CMAKE_COMMAND}" -E copy ${_shader} $<TARGET_FILE_DIR:${_name}>
)

If you need more (compilers/linkers that are not finding the Windows SDK automatically), you may want to look the following find_package() config code:

这篇关于使用CMake查找Direct3D 12的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆