4

我正在尝试在 Visual Studio Express 2012 for Windows Desktop 中安装 SDL_ttf,并且我有一个可以正常编译的小示例程序,但是当我运行它时,我收到一个错误弹出窗口,提示“应用程序无法正确启动 (0xc000007b)。单击“确定”关闭应用程序”。

我最初让基本的 SDL 工作,然后我尝试添加 SDL 字体。我已经完成了以下操作,但我仍然遇到麻烦,如果有人可以帮助我,将不胜感激......

1) 我将所有 .lib 文件夹复制到 Visual Studio lib 文件夹 (C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\lib) (分别是 SDL.lib、SDLMain.lib 和 SDL_ttf.lib)

2)我在项目属性中添加了 SDL 和 SDL_ttf 的包含目录(在项目 >> 属性 >> 配置属性 >> VC++ 目录 >> 包含目录下)...那些是 ("...\SDL Main Libraries\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;
}
4

2 回答 2

4

这个问题可能被重命名为“尝试在 Visual Studio Express 2012 for Windows Desktop 中安装第 3 方库”。虽然您的步骤有效,但它们在某种程度上并不是最佳的,特别是如果您计划分享您的项目并与其他人一起工作!

基本上,这类库带有 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默认情况下 Window 以单一配置为目标!要将您的更改应用于每个配置,请在顶部可能显示的下拉列表中Active(Debug)选择All Configurations,然后更改设置。它们将应用于您项目中的每个配置。

编辑:此外,对于共享项目,根据项目背后的心态,您可能希望将外部库包含在源代码管理中。我知道 linux 的人会完全反对这一点,但这是我经常看到的。它确保每个人都使用与代码对应的库版本(例如,如果您升级到更新版本的库并且界面发生了变化,如果您只更改源代码管理中的代码,您将不得不警告您的其他团队成员手动升级到新库,就像它在您的源代码管理中一样,同步将使他们与项目代码和外部库保持同步)。

于 2012-11-18T16:54:25.597 回答
0

是的,我发现这完全是为了弄乱链接器。我没有将它链接到 x86,我只是将它链接到 SDL_ttf 和 SDL 中的 lib 文件夹...这也与您下载的扩展程序的版本有关. 确保它们都是一样的。例如 1.2 和 1.2 和 2.0 和 2.0

于 2013-08-30T12:08:37.543 回答