【问题标题】:How can I link with gcc and SDL_image library?如何链接 gcc 和 SDL_image 库?
【发布时间】:2015-09-11 01:31:40
【问题描述】:

我有以下脚本:

gcc -I /Library/Frameworks/SDL2.framework/Headers \
    -F /Library/Frameworks/ -framework SDL2 test.c

成功编译以下源代码:

#include <SDL.h>
//#include "SDL_image.h"

int init();
int loadMedia();
void close();

SDL_Window* gWindow = NULL;
SDL_Surface* gScreenSurface = NULL;
SDL_Surface* gHelloWorld = NULL;

int init()
{
    int success = 1;

    if(SDL_Init(SDL_INIT_VIDEO) < 0)
    {
        printf("SDL could not initialize! SDL_Error: %s\n", SDL_GetError());
    }
}

int main(int argc, char* args[])
{
    return 0;
}

我的问题是如何使用添加的库 SDL_image 编译它?会是这样吗?

gcc -I /Library/Frameworks/SDL2.framework/Headers \
    -I /Library/Frameworks/SDL_image.framework/Headers \
    -F /Library/Frameworks/ -framework SDL2 test.c

当我尝试这个时,我得到以下错误:

In file included from test.c:2:
/Library/Frameworks/SDL_image.framework/Headers/SDL_image.h:27:10:      fatal error: 
      'SDL/SDL.h' file not found 
`#include <SDL/SDL.h>`

【问题讨论】:

  • 有趣的是,您的“脚本”看起来与 C 源代码一模一样。还是您的意思是隐藏在文本中的命令?
  • 我怀疑您是否真的想将 gcc 与一些不相关的库链接。但是,如果您想将应用程序与库链接并想知道如何告诉 gcc 这样做:(这是在所有源文件干净编译之后)`gcc -o -L -l(小写“L”)短库名。注意:当完整的库名称为“libmath.so”时,短库名称将是“math”,以获取短库名称:。删除前导 'lib' 和 '.' 中的所有内容向前
  • 感谢您的快速回复。致奥拉夫:我说的是隐藏在文本中的命令。该命令位于脚本文件中。我只是发现执行这个文件更容易,而不是在命令行上全部输入。
  • 致 user3629249:我尝试以下命令:“gcc test.c -o a.out -L /Library/Frameworks -l SDL2”和“gcc test.c -o a.out -L /Library/Frameworks -l SDL2.framework”并且不起作用。也许我做错了?感谢您的快速回复。
  • 为什么要在包含列表中显式添加框架头目录?

标签: c gcc sdl sdl-image


【解决方案1】:

你可以这样做:

gcc -L/libs/path -I/headers/path -lSDL2 -lSDL2_image

在这种情况下,使用 #include "..." 包含您的 SDL2 标头。

如果您使用包管理器安装 SDL2,则之前的命令会简化为:

gcc -lSDL2 -lSDL2_image

因为编译器知道 SDL2 目录的路径。 在这种情况下,您应该使用#include &lt;...&gt;

您应该考虑为您的项目编写一个 Makefile。随着项目的发展,它会变得更容易编译。

【讨论】:

  • 感谢您的快速回复。对于 -L 选项,我的命令是“gcc -L/Library -l/Library/Frameworks/SDL2.framework/Headers -lSDL2 test.c -o a.out”吗?我用 和“SDL.h”尝试了这两个命令。现在我无法让 gcc 仅使用 SDL 包含进行编译。我想我需要用“-H”选项指定我的头文件,用“-F”选项指定框架,并将“-framework SDL2”传递给gcc。除非我使用错误的 -L 和 -l 选项。我不确定这是否重要,但我正在 Mac 上编程。
  • 很抱歉,我假设您在 Linux 上工作。在 Mac 上,您必须将 SDL2main.m 和 SDL2main.h 放入您的项目目录并执行类似gcc -I/Library/Frameworks/SDL2.framework/Headers test.c -o test SDL2main.m -framework SDL2 的操作。当然,SDL2_image 也是如此。
  • 感谢您的回复。我尝试了您的建议,但我很困惑,因为我找不到 SDL2main.m。我看到的唯一文件是头文件,例如 SDL.h 和 SDL_main.h。我没有在正确的目录中寻找吗?我在 /Library/Frameworks/SDL2.framework/Headers 中找到的框架下找到了这些文件。我在搞乱这些选项,发现了一个让我走得更远的组合,但现在出现了一个不同的错误。我试过的组合是:
  • "gcc -I/Library/Frameworks/SDL2.framework/Headers -I/Library/Frameworks/SDL_image.framework/Headers -F/Library/Frameworks -framework SDL2 -framework SDL_image test.c - o 测试”。现在我收到一条错误消息:“在 test.c:2 中包含的文件中:/Library/Frameworks/SDL_image.framework/Headers/SDL_image.h:27:10:致命错误:找不到‘SDL/SDL.h’文件#include " 此错误由文件 SDL_image.h 生成。当我在每行中删除“SDL/blah.h”的 SDL 时
  • 编译器编译文件,但现在当我运行生成的可执行文件时,我收到一个奇怪的错误:“dyld:未加载库:@rpath/SDL.framework/Versions/A/SDL 引用自:/库/框架/SDL_image.framework/Versions/A/SDL_image 原因:找不到图像”。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 2023-01-01
  • 1970-01-01
  • 2020-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多