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 ответ:
Итак, я исправил это, и вот как.
Прежде всего. Если вы получаете кучу ошибок компоновщика, то вы, вероятно, что-то напутали, связывая библиотеку. Проверьте настройки компоновщика в 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
Так что, возможно, это была моя проблема.
Итак, что же я узнал из этого:
- не возитесь с вещами, которые вы не совсем понимаете
- Если вы получаете какие-либо ошибки при построении, не просто просматривайте их, а читайте все, потому что почти всегда будет какая-то полезная информация, касающаяся вашего вопроса
- Если вы решили построить библиотеки самостоятельно или у вас нет другого выбора, кроме как построить их самостоятельно, то убедитесь, что вы правильно следуете инструкциям (если они есть) и всегда выполняете отдельные тесты, прежде чем пытаться связать несколько библиотек вместе, иначе вы будете обвинять не ту библиотеку в своих ошибках