使用 SDL2 的 C 程序不会用 clang 编译

C program using SDL2 will not compile with clang

我在尝试编译我的 C 程序时遇到问题。我在 macOS Catalina 上使用 clang 编译。

当我尝试 SDL_Init( SDL_INIT_VIDEO ); 并编译时,clang 告诉我链接器命令失败

Undefined symbols for architecture x86_64:
  "_SDL_Init", referenced from:
      _main in main-1defaf.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我用 brew 安装了 SDL2 brew install SDL2。所以这些是我试图让 clang 传递给链接器的标志,但没有一个起作用。

  > clang main.c -L/usr/local/Cellar/sdl2/2.0.12_1/include/SDL2

  > clang main.c -L/usr/local/Cellar/sdl2/2.0.12_1/include/SDL2 \
  -L/usr/local/Cellar/sdl2/2.0.12_1/lib

因为它们不起作用,所以我尝试添加 -framework 标志。我按照我发现的说明进行操作 here to install the framework. However the website didn't mention how to use it with clang. Clangs documentation 没有提及是否需要指向框架文件或目录,所以我尝试了几种不同的方法但无法正常工作。

  > clang main.c -L/usr/local/Cellar/sdl2/2.0.12_1/include/SDL2 \
  -framework SDL2

ld: framework not found SDL2
clang: error: linker command failed with exit code 1 (use -v to see invocation)

  > clang main.c -L/usr/local/Cellar/sdl2/2.0.12_1/include/SDL2 \
  -framework /Library/Framework/SDL2.framework

ld: framework not found /Library/Framework/SDL2.framework
clang: error: linker command failed with exit code 1 (use -v to see invocation)

  > clang main.c -L/usr/local/Cellar/sdl2/2.0.12_1/include/SDL2 \
    -framework /Library/Frameworks/SDL2.framework/SDL2

ld: framework not found /Library/Frameworks/SDL2.framework/SDL2
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我也试过只使用 XCode 进行编译,它构建成功,但未能 运行 并出现以下错误。我按照上面链接的教程中的说明进行操作。

2020-06-30 16:07:36.220432-0700 sdl_test[1867:31873] Metal API Validation Enabled
2020-06-30 16:07:36.273590-0700 sdl_test[1867:32300] flock failed to lock maps file: errno = 35
2020-06-30 16:07:36.274022-0700 sdl_test[1867:32300] flock failed to lock maps file: errno = 35
Program ended with exit code: 0

我已经重新启动计算机并清理了构建,根据一些 google 搜索,这似乎是在 XCode 的最新版本中引入的,需要解决。

我想坚持使用 clang,但不确定我还能尝试什么来编译它。我想了解后续步骤的方向。

这是我正在尝试的代码 运行。

#include <SDL2/SDL.h>
#include <stdio.h>

int main(int argc, const char * argv[]) {
    SDL_Init( SDL_INIT_VIDEO );
    return 0;
}

您缺少 -lSDL2 来引入共享库,如果您要使用 /usr/local/Cellar/sdl2/2.0.12_1/include/SDL2,您应该只 #include <SDL.h>

考虑使用 pkg-config 来处理包含和 link 标志。

clang main.c -o main `pkg-config --libs --cflags sdl2`