【问题标题】:C program using SDL2 will not compile with clang使用 SDL2 的 C 程序不能用 clang 编译
【发布时间】:2020-07-01 00:55:08
【问题描述】:

我在尝试编译我的 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 来安装带有 brew install SDL2 的 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 的说明安装了框架。但是该网站没有提到如何将它与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

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

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

这是我要运行的代码。

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

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

【问题讨论】:

  • 您是否尝试过改用pkg-configpkg-config --cflags --libs sdl2(或者可能是 libsdl2)。 stackoverflow.com/a/38902949/14660
  • 您没有链接到任何库。 -L 开关指定将在哪些目录中搜索您提供的库名称。
  • 我在尝试使用 Xcode 时一直在处理同样的问题。我在这里和其他论坛也看到很多人有同样的问题。有谁知道如何解决这个问题(同时仍在使用 Xcode)?

标签: c clang sdl-2


【解决方案1】:

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

考虑使用pkg-config 处理包含和链接标志。

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

【讨论】:

  • pkg-config 输出应该在main.c 之后。
  • @HolyBlackCat 我不认为这是正确的。 pkg-config 输出编译器选项,clang 记录为 clang [options] filename ...。实际上,大多数程序并不关心您将选项放在哪里。
  • 我能够让它与-lSDL2pkg-config 一起工作。我会坚持使用 pkg-config,感谢您的建议。 #include &lt;SDL.h&gt; 没有,仍然需要 SDL2/ 首先。
  • 我现在找不到好的参考,但clang `pkg-config --libs --cflags sdl2` main.c -o main 对我不起作用,我仍然得到未定义的参考。但是clang main.c `pkg-config --libs --cflags sdl2` -o main 确实有效。
  • @Schwern -l 标志必须在对象和/或源之后(除非您使用像 LLD 这样的花哨的链接器)。大多数其他标志可以放在任何地方。
猜你喜欢
  • 1970-01-01
  • 2017-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多