c++ dwmapi.lib、D3DCompiler.lib和Comctl32.lib提供有关d3d11.lib的链接器警告

ivqmmu1c  于 2023-02-01  发布在  其他
关注(0)|答案(1)|浏览(243)

具体而言,警告包括:

4>Comctl32.lib(COMCTL32.dll) : warning LNK4006: __NULL_IMPORT_DESCRIPTOR already defined in d3d11.lib(d3d11.dll); second definition ignored
4>D3DCompiler.lib(D3DCOMPILER_47.dll) : warning LNK4006: __NULL_IMPORT_DESCRIPTOR already defined in d3d11.lib(d3d11.dll); second definition ignored
4>dwmapi.lib(dwmapi.dll) : warning LNK4006: __NULL_IMPORT_DESCRIPTOR already defined in d3d11.lib(d3d11.dll); second definition ignored

从我在网上读到的内容来看,这意味着我不止一次链接了d3d11.lib
我所做的是将Comctl32.libD3DCompiler.libd3d11.libdwmapi.lib链接到一个静态库,然后在另一个可执行文件中链接该静态库(没有其他内容)。警告只在构建静态库时出现,在构建可执行文件时不会出现。我知道这可能不会影响任何事情,但最好是删除所有警告。
我正在使用Visual Studio和Premake生成的解决方案。Premake方面不应该有任何更改,因为前面提到的库只是在属性页的“附加依赖项”字段中列出。我已检查可执行文件的“附加依赖项”字段中没有列出任何内容。
我知道我可能没有包含足够多的信息来最终解决这个问题,但任何提示,以指出我正确的方向将是伟大的。谢谢!

bqujaahr

bqujaahr1#

尽管 Microsoft Visual Studio 允许通过Librarian属性页将静态库链接到其它静态库,但执行此操作时,LNK 4006错误是不可避免的。

  • 正确 * 的方法是首先从静态库的Librarian属性中删除所有Additional Dependencies。相反,将以下杂注添加到静态库的“public”头文件中:
#pragma comment(lib,"comctl32.lib")
#pragma comment(lib,"d3d11.lib")
#pragma comment(lib,"d3dcompiler.lib")
#pragma comment(lib,"dwmapi.lib")

为每个配置和平台编译静态库。
在可执行项目属性中:

C/C++ -常规-附加包含目录

  • 添加静态库文件夹(包含“public”头文件的文件夹)。
    链接器-常规-其他库目录
  • 添加静态库文件夹。
    链接器-输入-其他依赖项
  • 添加静态库(lib)文件。

现在,您可以编译项目,而不会出现LNK 4006警告。
注意:必须为每个配置和平台重复Linker属性。

相关问题