Я пытаюсь установить SDL_ttf в Visual Studio Express 2012 для Windows Desktop, и у меня есть небольшой пример программы, которая прекрасно компилируется, но при ее запуске появляется всплывающее окно с сообщением об ошибке: «Приложение не удалось правильно запустить (0xc000007b). Нажмите кнопку ОК, чтобы закрыть приложение «.
Изначально я получил базовый SDL для работы, затем попытался добавить шрифт SDL. Я сделал следующее, но у меня все еще есть проблема, если бы кто-то мог помочь мне, это было бы очень ценно …
1) Я скопировал все папки .lib в папку lib Visual Studio (C: \ Program Files (x86) \ Microsoft Visual Studio 11.0 \ VC \ lib) (это SDL.lib, SDLMain.lib и SDL_ttf.lib).
2) Я добавил свои каталоги включения для SDL и SDL_ttf в свойствах проекта (в разделе Проект >> Свойства >> Свойства конфигурации >> Каталоги VC ++ >> Включить каталоги)
…
Это («… \ Основные библиотеки SDL \ SDL-1.2.15 \ include»)
и («… \ Библиотеки шрифтов SDL \ SDL_ttf-2.0.11 \ include»)
3) Я добавил свои дополнительные зависимости для SDL и SDL_ttf (в разделе «Проект»> «Свойства»> «Свойства конфигурации» >> «Линкер» >> «Вход» >> «Дополнительные зависимости»), куда я помещаю:
SDL.lib
SDLMain.lib
SDL_ttf.lib
встроенный — это выглядит так: SDL.lib; SDLMain.lib; SDL_ttf.lib;% (AdditionalDependencies)
4) Я поместил следующие dll-файлы в ту же папку, что и мой .exe-файл (Visual Studio 2012 \ Projects \ ConsoleApplication2 \ Debug), эти dll-файлы:
SDL_image.dll
libfreetype-6.dll
SDL_ttf.dll
zlib1.dll
SDL.dll
И это мой небольшой пример исходного кода программы:
#include <iostream>
#include <SDL.h>
#include <SDL_ttf.h>
using namespace std;
int main(int argc, char** argv){
int retval = 0;
int sdlState = -1;
if((sdlState = SDL_Init(SDL_INIT_EVERYTHING)) == -1){
cerr << "SDL failed to initialize";
retval = 1;
}
SDL_Surface* screen = nullptr;
if(retval == 0){
if(nullptr == (screen =
SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_ASYNCBLIT)))
{
cerr << "Screen failed to be created";
retval = 1;
}
}
int ttfState = -1;
if(retval == 0){
if((ttfState = TTF_Init()) == -1){
cerr << "True Type Font failed to initialize";
retval = 1;
}
}
if(retval == 0){
//TTF_Font* font = TTF_OpenFont("air.ttf", 32);
SDL_Color txtColor = {0, 0, 0};
//SDL_Surface* text = TTF_RenderText_Solid(font, "Hello World",
//txtColor);
while(1){
SDL_FillRect(screen, NULL,
SDL_MapRGB(screen->format, 255, 255, 150));
//SDL_BlitSurface(text, NULL, screen, NULL);
SDL_Flip(screen);
}
}
if(ttfState != -1) TTF_Quit();
if(sdlState != -1) SDL_Quit();
return retval;
}
Этот вопрос может быть переименован в «Попытка установить стороннюю библиотеку в Visual Studio Express 2012 для Windows Desktop». Хотя ваши шаги работают, они несколько неоптимальны, особенно если вы планируете поделиться своим проектом и поработать с другими над ним!
В основном, такие библиотеки имеют 3 основных типа файлов: заголовки, библиотеки а также двоичные файлы. Вот несколько советов о том, как улучшить ваш проект:
заголовки — Эти файлы определяют интерфейс, который у вас есть с библиотекой. Обычно, чтобы сообщить Visual Studio об их местонахождении, предпочтительным методом является Project Settings > Configuration Properties > C/C++ > General > Additional Include Directories
, Если вы хотите поделиться своим проектом с кем-то (возможно, через систему контроля версий, такую как Perforce, Git или SVN), вы должны использовать Relative Paths
вместо Absolute Paths
, Я имею в виду, что если вы нацелены непосредственно на файл, такой как C:\Projects\SDL\...
в итоге вы ставите некоторые требования о том, где хранить ваш проект для каждого члена команды, как если бы вы использовали что-то вроде ..\External\SDL\...
Где бы другие члены команды не хранили ваше решение, оно должно работать, если у них есть нужные библиотеки в правильной относительной папке.
библиотеки — Есть две части для библиотек. Во-первых, вам нужно указать компоновщику, где искать нужные библиотеки. Делать НЕ скопируйте свои библиотеки непосредственно в папку VC \ libs, вместо этого используйте Project Settings > Configuration Properties > Linker > General > Additional Library Directories
, Здесь применяются те же правила относительно относительных папок. Затем вам нужно указать компоновщику, какие библиотеки использовать, это делается через Project Settings > Configuration Properties > Linker > Input > Additional Dependencies
где вы перечисляете все .lib
файлы, которые вы хотите, такие как SDL.lib
, SDLmain.lib
, SDL_ttf.lib
, так далее…
двоичные файлы — двоичные файлы здесь будут .dll
файлы, которые вам нужны. Простой вариант — просто скопировать их вручную в папку «Вывод» (помните, что у вас может быть несколько Configuration
, не только Debug
). В противном случае, вы можете автоматизировать процесс, имея некоторые Post-Build
шаги, которые копируют их автоматически для вас.
Для всех этих настроек учтите, что Project Properties
Окно по умолчанию ориентировано на одну конфигурацию! Чтобы ваши изменения применялись к каждой конфигурации, в раскрывающемся списке вверху, который, вероятно, говорит Active(Debug)
, Выбрать All Configurations
, затем измените настройки. Они будут применены к каждой конфигурации, имеющейся в вашем проекте.
Изменить: Кроме того, для совместного использования проектов, в зависимости от менталитета проекта, вы можете включить внешние библиотеки в систему контроля версий. Я знаю, что пользователи Linux будут полностью возражать против этого, но это то, что я видел очень часто. Это гарантирует, что все используют версию библиотеки, которая соответствует коду (например, если вы обновите библиотеку до более новой версии и изменился интерфейс, если вы только измените код в системе управления версиями, вы должны будете предупредить другие члены команды должны вручную обновить новую библиотеку, как если бы она находилась в вашем контроле исходного кода, синхронизация позволила бы им соответствовать как проекту, так и внешним библиотекам).
да, я обнаружил, что все дело в том, чтобы связываться с компоновщиками … я не связывал это с x86, я просто делал это с папкой lib в SDL_ttf и SDL … это также связано с версиями загружаемого вами расширения , Убедитесь, что они все одинаковые. например, 1,2 с 1,2 и 2,0 с 2,0