首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用DirectX12和CMake查找MinGW库

用DirectX12和CMake查找MinGW库
EN

Stack Overflow用户
提问于 2020-11-11 16:07:55
回答 2查看 1.2K关注 0票数 1

我试图使用CMake查找DirectX 12并将其链接到可执行文件。到目前为止,我在用MSVC编译时都很有用,但是在用GCC编译时失败了:Could NOT find D3D12 (missing: D3D12_LIBRARIES)

我使用的是稍微修改过的FindD3D12.cmake版本

代码语言:javascript
复制
# Find the win10 SDK path.
if ("$ENV{WIN10_SDK_PATH}$ENV{WIN10_SDK_VERSION}" STREQUAL "" )
        get_filename_component(WIN10_SDK_PATH "[HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\Microsoft\\Microsoft SDKs\\Windows\\v10.0;InstallationFolder]" ABSOLUTE CACHE)
        get_filename_component(TEMP_WIN10_SDK_VERSION "[HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\Microsoft\\Microsoft SDKs\\Windows\\v10.0;ProductVersion]" ABSOLUTE CACHE)
        get_filename_component(WIN10_SDK_VERSION ${TEMP_WIN10_SDK_VERSION} NAME)
elseif(TRUE)
        set (WIN10_SDK_PATH $ENV{WIN10_SDK_PATH})
        set (WIN10_SDK_VERSION $ENV{WIN10_SDK_VERSION})
endif ("$ENV{WIN10_SDK_PATH}$ENV{WIN10_SDK_VERSION}" STREQUAL "" )

# WIN10_SDK_PATH will be something like C:\Program Files (x86)\Windows Kits\10
# WIN10_SDK_VERSION will be something like 10.0.14393 or 10.0.14393.0; we need the
# one that matches the directory name.

if (IS_DIRECTORY "${WIN10_SDK_PATH}/Include/${WIN10_SDK_VERSION}.0")
        set(WIN10_SDK_VERSION "${WIN10_SDK_VERSION}.0")
endif (IS_DIRECTORY "${WIN10_SDK_PATH}/Include/${WIN10_SDK_VERSION}.0")


# Find the d3d12 and dxgi include path, it will typically look something like this.
# C:\Program Files (x86)\Windows Kits\10\Include\10.0.10586.0\um\d3d12.h
# C:\Program Files (x86)\Windows Kits\10\Include\10.0.10586.0\shared\dxgi1_4.h
find_path(
        D3D12_INCLUDE_DIR    # Set variable D3D12_INCLUDE_DIR
        d3d12.h              # Find a path with d3d12.h
        HINTS "${WIN10_SDK_PATH}/Include/${WIN10_SDK_VERSION}/um"
        DOC "path to WIN10 SDK header files"
        HINTS
)

find_path(
        DXGI_INCLUDE_DIR    # Set variable DXGI_INCLUDE_DIR
        dxgi1_4.h           # Find a path with dxgi1_4.h
        HINTS "${WIN10_SDK_PATH}/Include/${WIN10_SDK_VERSION}/shared"
        DOC "path to WIN10 SDK header files"
        HINTS
)
set(D3D12_INCLUDE_DIRS ${D3D12_INCLUDE_DIR} ${DXGI_INCLUDE_DIR})

# Find D3D libraries
set(D3D12_LIB_NAMES d3d12.lib dxgi.lib d3dcompiler.lib dxguid.lib)

set(D3D12_LIBRARIES)
foreach (D3D12_LIB_NAME ${D3D12_LIB_NAMES})
        find_library(${D3D12_LIB_NAME}_LOC NAMES ${D3D12_LIB_NAME} HINTS ${D3D12_HINTS_PATH})
        set(D3D12_LIBRARIES ${D3D12_LIBRARIES} ${${D3D12_LIB_NAME}_LOC})
endforeach(D3D12_LIB_NAME)

include(FindPackageHandleStandardArgs)
# handle the QUIETLY and REQUIRED arguments and set D3D12_FOUND to TRUE
# if all listed variables are TRUE
find_package_handle_standard_args(
        D3D12  DEFAULT_MSG
        D3D12_INCLUDE_DIRS D3D12_LIBRARIES
)

mark_as_advanced(D3D12_INCLUDE_DIRS D3D12_LIBRARIES)

然后将其链接到:target_link_libraries(<name> ${D3D12_LIBRARIES})

D3D12_INCLUDE_DIRS变量被设置为正确的值,问题只存在于库中。

是DirectX 12库与GCC不兼容,CMake是聪明到足以解决这个问题,还是我在试图找到它们时做错了什么?

编辑:

如前所述,不需要FindD3D12.cmake模块。在Windows上编译时,DirectX库是系统库,所以target_link_libraries(<name> PRIVATE d3d12.lib dxgi.lib d3dcompiler.lib dxguid.lib)可以工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-11 16:39:22

======================================================

Windows:

DirectX是Windows的一部分。

如果您正在Windows上编译,那么您就不可能不使用SDK进行编译。因此,不要担心处理包含目录之类的问题。

因此,您可以将Directx库作为常规的系统库来处理,下面的命令将起作用。这就是cmake的魔力。

所以你大部分的cmake都不是必要的。至少如果你使用的是视觉工作室。如果您不使用visual,则可能需要编写工具链(id#cmake-工具链-7)。

代码语言:javascript
复制
# DX12 libraries
target_link_libraries(foobar PRIVATE
    d3d12.lib
    dxgi.lib
    dxguid.lib
)

======================================================

Linux:

其次,DirectX12将支持linux:https://devblogs.microsoft.com/directx/directx-heart-linux/

但是,我认为它不允许使用图形功能,只允许使用计算功能。但不管怎么说,假设微软没有让它变得极其痛苦,那么cmake应该是大致相似的。

======================================================

最后,如果您想知道您正在构建的SDK的哪个版本,请查看CMAKE_SYSTEM_VERSION。

在windows上,在第一个项目调用设置SDK版本之前设置此选项。因为这就是SDK版本所代表的。版本的windows生成。

另外,为了格外小心,在代码库中添加额外的static_asserts,以确保您使用的是您想要的SDK版本,您可能已经使用了"Windows.h“。然后检查编译器定义,这些定义告诉您正在编译的Windows OS的版本。

“当您使用Windows时,可以指定您的代码可以在哪个版本上运行。预处理器宏WINVER和_WIN32_WINNT指定您的代码支持的最低操作系统版本。Visual和微软C++编译器支持针对Windows 7 SP1及更高版本。旧的工具集包括对Windows SP2、Windows 2003 SP1、Vista和Windows 2008的支持。Windows 95、Windows 98、Windows、Windows和Windows 2000不受支持。”--微软文档(https://learn.microsoft.com/en-us/cpp/porting/modifying-winver-and-win32-winnt?view=msvc-160)。

票数 2
EN

Stack Overflow用户

发布于 2020-11-11 16:14:45

DirectX 12库与GCC不兼容吗?

每个编译器都有自己的库格式,cl使用.lib库,gcc使用.a.so库。您不能只拿cl的库(这是存储在Windows中的库)并将它们提供给gcc。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64789975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档