繁体   English   中英

使用 SDL2 的 C 程序将无法与 clang 一起编译

[英]C program using SDL2 will not compile with clang

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

当我尝试SDL_Init( SDL_INIT_VIDEO ); 并编译 clang 告诉我有一个 linker 命令失败

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 传递给 linker 的标志,但没有一个有效。

  > 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标志。 我按照我在这里找到的说明安装了框架。 但是该网站没有提到如何将它与 clang 一起使用。 Clangs 文档没有提到我是否需要指向框架文件或目录,所以我尝试了几种不同的方法,但都无法正常工作。

  > 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

我已经重新启动计算机并清理了构建,并且根据一些谷歌搜索,这似乎是在需要解决的 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来处理包含和链接标志。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM