我能';t使SDL+;Visual Studio 2012中的OpenGL工作 我刚刚开始了一个使用SDL学习C++ OpenGL的教程。视频教程中显示的步骤是通过使用称为代码块的IDE完成的,但我认为它也适用于VisualStudio2012

我能';t使SDL+;Visual Studio 2012中的OpenGL工作 我刚刚开始了一个使用SDL学习C++ OpenGL的教程。视频教程中显示的步骤是通过使用称为代码块的IDE完成的,但我认为它也适用于VisualStudio2012,c++,opengl,visual-studio-2012,sdl,C++,Opengl,Visual Studio 2012,Sdl,我下载了适用于Windowsx64的SDL2开发人员(我的Windows7是64位的,但我的VisualStudio2012是x86版本) 要在Visual Studio 2012中安装SDL2,我将: include文件夹中的.h文件(D:\Program files(x86)\Microsoft Visual Studio 11.0\VC\include\SDL) lib文件夹中的.lib文件(D:\Program files(x86)\Microsoft Visual Studio 11

我下载了适用于Windowsx64的SDL2开发人员(我的Windows7是64位的,但我的VisualStudio2012是x86版本)

要在Visual Studio 2012中安装SDL2,我将:

  • include文件夹中的.h文件(D:\Program files(x86)\Microsoft Visual Studio 11.0\VC\include\SDL)
  • lib文件夹中的.lib文件(D:\Program files(x86)\Microsoft Visual Studio 11.0\VC\lib\SDL)
  • C:/Windows/system文件夹中的.dll文件
在那之后,我打开了IDE,做了一个新项目,当我编写代码时,特定SDL特性的自动完成弹出,这意味着成功。。。直到我试着运行它

这是我根据视频教程编写的代码:

#include "SDL.h"

int main(int argc, char* args[]){
    SDL_Init(SDL_INIT_EVERYTHING);

    SDL_Quit();

    return 0;
}
当我单击“启动调试”或“启动而不调试”时,在按yes构建它之后,输出会出现错误

以下是我编写的代码的屏幕截图,以及输出:

在那之后,我尝试了本教程已经使用的SDL的旧版本,即1.2版(我重写了几个新版本的文件),但仍然没有很好的效果


如何修复它,以便使用OpenGL+SDL功能进行练习?

您必须将lib文件链接到exe中。请参见项目、属性、链接和其他依赖项。将lib文件的名称放在那里。

TLDR:

在项目中使用库时

  • 编译需要头文件名(
    #include
    )和包含它们的包含目录
  • 链接需要lib文件名(
    *.lib
    ,您缺少的内容)和包含它们的库目录
  • 运行需要动态库(
    *.dll
    ),通常使用与当前或系统目录中的
    .lib
    相同的名称(VS也有二进制目录,但我从来不需要知道它们的确切用途)

当您编译代码并添加
#include
时,编译器会运行一个可能的目录列表,以找到该文件。已经设置了一些默认目录,但这样您就不会在一个地方把所有库搞得一团糟,可以添加更多。例如如果您的SDL.h位于include目录中的子目录中,则找不到它-例如,只需检查它不应该是
或类似的内容

设置包含路径和正确的
#include
可以编译代码。现在是连接阶段。你有一些代码说我需要这些函数,链接器必须找到这些函数的实际代码并静态链接它们(所有代码都可以在
.lib
中找到),或者设置程序在运行时动态链接(在这种情况下,程序需要能够找到
.dll
,我认为在windows上您需要一个与之配套的
.lib
文件)

因此,除了include目录之外,您还需要一个库目录。此外,正如您对编译器所说的那样,您需要告诉链接器为
SDL.lib中的
SDL.h
中定义的那些函数查找代码(加载
SDL.dll
时,可能会在运行时实际提供代码)。我认为指定库甚至可以通过调用
#pragma
来完成,但更常见的是将库文件指定为链接器程序的参数。正如@ScottMcP MVP所说,
SDL.lib
附加到
项目属性->配置属性->链接器->输入->附加依赖项
列表中trong>。如果仍然显示
未解析外部
,则通常意味着链接器仍然找不到文件,因此请检查键入错误并仔细检查目录。最坏的情况是SDL.h和SDL.lib之间不匹配,或者SDL.lib是使用不同的选项或不同的编译器编译的

您收到的错误是链接器说编译器说我需要一个“外部”函数,
SDL_Init
,以使您的代码正常工作,但我还没有找到/解决给定库列表中的引用

正如示例/recap所示,所有这些GUI选项最终都会转到编译器/链接器。例如,完整的编译行可能如下所示:

./compiler -I/path/to/my/includes -L/path/to/my/lib -lmylibrary.lib mycode.cpp  -o myexecutable.exe
其中
mycode.cpp
包含
#include
。请注意这里的
/compiler
同时作为编译器和链接器运行。该过程可分为:

./compiler -I/path/to/my/includes mycode.cpp -o mycompiledcode.o
./linker -L/path/to/my/lib -lmylibrary.lib mycompiledcode.o -o myexecutable.exe
一旦有了可执行文件,它需要在运行时能够找到
SDL.dll
。正如您所做的那样,可执行文件应该搜索windows系统目录。它还应该搜索其当前目录。在linux上,您可以设置
rpath
(在windows上不确定)。如果应用程序配置一直不正确,并且dll肯定存在,则是时候抓取并查看程序实际尝试加载的dll名称。最糟糕的情况是,应用程序在所需的dll之前找到不同版本的dll或具有相同名称的其他内容

祝你好运。OpenGL非常有趣


[编辑]

您可以使用x32或x64 lib文件,但所有代码必须相同。从x32开始可能会更容易,如果您需要快速
double
计算和更多ram,那么就可以更改。OpenGL还没有对x64的强大支持,因此它可能不会对您产生太大影响

附加依赖项
仅放置“
SDL.lib
”。然后,此文件需要存在于visual studio的一个库目录中。如果不再从SDL获取未解析的外部,则该部分
#include <SDL.h> //my include is <SDL2/SDL.h>, as I have both an SDL and SDL2 dir in my include path

#ifdef main
#undef main //remove SDL's main() hook if it exists
#endif