c++ - 使用 CMake 查找 Direct3D 12

标签 c++ cmake

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

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

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
)

目前我的 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(其中 the Direct3D SDK is now part of )位于标准搜索路径中,例如库的链接器。所以它由 MSVC 编译器和链接器自动找到。

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

工作示例

这是一个最小的工作示例(已测试 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}>
)

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

关于c++ - 使用 CMake 查找 Direct3D 12,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48955632/

相关文章:

visual-studio-2010 - Qt5、CMake、AUTOMOC 和预编译头文件

c++ - Ubuntu 上的 Cmake 可执行文件在哪里

c++ - 内部类的模板编译错误

c++ - '\r' 转义序列有什么用?

c++ - 无法使用与时间和时钟相关的函数 C++ 进行编译

Android Studio CMake 错误 : Build Command failed

C++ 链接器错误 SDL 图像 - 无法读取符号

c++ - 像计算机一样思考的策略

c++ - 使cmake将命令行变量传递给编译器

opencv - OpenKinect:无法构建 RGBDemo