使用CMake查找Direct3D 12 [英] Finding Direct3D 12 using CMake
问题描述
所以我一直在尝试学习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屋!