C++ Visual Studio 2012 получение Box2D и SFML для совместной работы


В основном я пытаюсь заставить SFML и Box2D работать вместе под VS2012. Я заставляю их работать независимо друг от друга, но не могу заставить их работать вместе.

Если я попытаюсь запустить их вместе, я получу кучу:

error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MDd_DynamicDebug' doesn't match value 'MTd_StaticDebug' in Main.obj

Если я изменю значение RuntimeLibrary в свойствах с MDd на MTd, то получу кучу ошибок, таких как:

error LNK2005: __amsg_exit already defined in MSVCRTD.lib(MSVCR110D.dll)
error LNK2005: __cexit already defined in MSVCRTD.lib(MSVCR110D.dll)
error LNK2005: __exit already defined in MSVCRTD.lib(MSVCR110D.dll)

Куча таких вместе с двумя предупреждениями:

 warning LNK4098: defaultlib 'MSVCRTD' conflicts with use of other libs; use /NODEFAULTLIB:library` 
 warning LNK4098: defaultlib 'libcmtd.lib' conflicts with use of other libs; use /NODEFAULTLIB:library

Который, если я делаю, также не работает, и я получаю кучу ошибок похоже на:

error LNK2001: unresolved external symbol __purecall

Для SFML я абсолютно уверен, что построил его правильно. Для Box2D, с другой стороны, я не так уверен. Я использовал Это руководство и, как вы можете видеть, оно предназначено для VS2010. Однако я не получил никаких ошибок при строительстве и HelloWorld.пример cpp прошел без каких-либо проблем.

Так есть ли что-нибудь, что я могу сделать, чтобы это сработало?

EDIT: я получил его для работы, однако только для отладочной версии Что я сделал, так это попытался восстановить библиотеку Box2D как /MTd для отладки и /MT для выпуска Отладочный был построен нормально, в то время как релизная версия-нет.
Отладочная версия работает нормально, однако релизная версия выбрасывает

warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library

И ошибки, почти идентичные второму списку ошибок в этом посте

Есть ли какие-либо решения для этого?

EDIT_2: похоже, что проблема была в dll-файлах. Я восстановил SFML, и теперь он, кажется, работает. Позже я сделаю еще несколько тестов, чтобы определить, исправил я его или нет.

1 2

1 ответ:

Итак, я исправил это, и вот как.

Прежде всего. Если вы получаете кучу ошибок компоновщика, то вы, вероятно, что-то напутали, связывая библиотеку. Проверьте настройки компоновщика в IDE.

Что я испортил, так это то, что я изменял значения библиотеки времени выполнения в свойствах проекта - > C/C++ - > параметры генерации кода в Visual Studio 2012 (по неизвестной причине). Что вызвало многочисленные ошибки компоновщика.

После того, как я, наконец, исправил их мое приложение скомпилирован успешно, однако при попытке запустить его я получил:

The application was unable to start correctly (0xc000007b). Click OK to close the application

То, что это оказалось ошибочным .похоже, это dll-файлы. Я восстановил последнюю версию SFML2 с помощью CMake, а затем восстановил библиотеки и библиотеки DLL в VS2012, и теперь все работает.

Я до сих пор не уверен, что заставило их перестать работать должным образом в первую очередь, так как я использовал их же .dll файлы раньше, и они все вдруг начали бросать мне эту ошибку.

Из того, что я смог собрать (0xc000007b), можно связать кому:

Проблема была вызвана 32/64-битными несоответствиями различных системных библиотек DLL, требуемых Visual studio. Каким-то образом библиотеки DLL, которые ему нужны, были заменены 64-разрядными версиями, которые он не мог загрузить.

Источник: форум MSDN

Так что, возможно, это была моя проблема.

Итак, что же я узнал из этого:

  1. не возитесь с вещами, которые вы не совсем понимаете
  2. Если вы получаете какие-либо ошибки при построении, не просто просматривайте их, а читайте все, потому что почти всегда будет какая-то полезная информация, касающаяся вашего вопроса
  3. Если вы решили построить библиотеки самостоятельно или у вас нет другого выбора, кроме как построить их самостоятельно, то убедитесь, что вы правильно следуете инструкциям (если они есть) и всегда выполняете отдельные тесты, прежде чем пытаться связать несколько библиотек вместе, иначе вы будете обвинять не ту библиотеку в своих ошибках