D3D11CreateDeviceAndSwapChain Неразрешенный внешний

Это совершенно сводит меня с ума. Когда я компилирую свою программу, я получаю следующее сообщение об ошибке:

ошибка LNK2019: неразрешенный внешний символ _D3D11CreateDeviceAndSwapChain@48

Я знаю, что у меня есть все правильные каталоги lib/ и include (x86), и я отследил проблему до того, что если я перехожу к определению (F12), я получаю два символа, один для каталога установки DirectXSDK, и один в "c:\Program Files (x86)\Windows Kits\8.0\Include\um".

На всю жизнь я понятия не имею, что делать. Я просмотрел все каталоги включения/исключения и не могу решить эту проблему, и я не знаю, что делать. Может кто-нибудь мне помочь?


person A.R.    schedule 24.04.2013    source источник
comment
Возможно, потому что эти библиотеки имеют разные флаги компиляции.   -  person gongzhitaao    schedule 24.04.2013
comment
Вы уверены, что ссылаетесь на D3d11.lib? Включите подробное связывание.   -  person Luke    schedule 24.04.2013


Ответы (3)


Я сам столкнулся с этой ошибкой и решил ее с помощью предложения Люка в его комментарии.

Предполагая, что вы используете Visual Studio, попробуйте открыть окно свойств вашего проекта и перейти к Linker -> Input. В разделе «Дополнительные зависимости» добавьте d3d11.lib и повторите попытку привязки.

person kevintodisco    schedule 06.08.2013
comment
Кроме того, вы можете поместить #pragma comment(lib, d3d11.lib) в заголовок вашего движка. - person Henry Bennett; 31.12.2014
comment
Работал как шарм. Благодарю вас! - person Ron Nuni; 13.04.2017
comment
Это решение для Visual Studio 2017 Enterprise в последней инсайдерской сборке Windows 10. (добавление d3d11.lib в дополнительные зависимости) - person Willi; 08.07.2017

Хорошо. Прежде чем сходить с ума, проверьте, что:

  • вы связываетесь с той же архитектурой, что и ваше приложение: x86, x64, arm (это обычная ошибка =))

    C:\Program Files (x86)\Windows Kits\8.0\Lib\win8\um\x86

    C:\Program Files (x86)\Windows Kits\8.0\Lib\win8\um\x64

    C:\Program Files (x86)\Windows Kits\8.0\Lib\win8\um\arm

  • вы связываете lib из того же SDK, что и ваш заголовок (в вашем источнике попробуйте явно ввести пути):

    #include "c:\Program Files (x86)\Windows Kits\8.0\Include\um\header.h"

    #pragma comment(lib, "C:\\Program Files (x86)\\Windows Kits\\8.0\\Lib\\win8\\um\\x64\\library.lib")

  • проверьте, что сами библиотеки в порядке (существуют, не повреждены): удалите старые DXSDK и Win8SDK, затем переустановите только одну из них, попробуйте ее, затем другую. (Также неплохо просто скопировать куда-нибудь документы и туториалы из старого SDK, удалить его и вообще забыть)

  • попробуйте новый #pragma linker (не #pragma lib) с подробным флагом, чтобы получить вывод компоновщика:

    #define USE_OLD_DXSDK

    #ifdef USE_OLD_DXSDK

    #pragma comment(linker "c:\\path\\to\\old_sdk\\d3d11.lib -verbose")

    #else

    #pragma comment(linker, "c:\\path\\to\\new_sdk\\d3d11.lib -verbose")

    #endif

  • Пойдите другим путем: создайте новое маленькое приложение и попробуйте написать D3D11CreateDeviceAndSwapChain материал с нуля. Только #include и link то, что сейчас нужно и ничего больше. Попробуйте воспроизвести ошибку компоновщика, чтобы понять, почему это происходит, и узнать, как исправить ее в основном приложении.

Удачного кодирования!

person Ivan Aksamentov - Drop    schedule 24.04.2013

Перепроверьте свою IDE на наличие библиотек и убедитесь, что ваша IDE использует набор символов Unicode и что вы правильно используете функции и строки Unicode. Кроме того, дважды проверьте правильность добавления \lib\x86 (или x64, если это так), в библиотеки вашего проекта.

person Felype    schedule 29.04.2013