c - 使用 SDL2 的 C 程序不能用 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
标志。我按照我在这里找到的说明安装了框架。但是该网站没有提到如何将它与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 中引入的。
我想坚持铿锵声,不知道我还能尝试什么来编译它。我想为接下来的步骤提供一些指导。
这是我要运行的代码。
#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`
推荐阅读
- c++ - 如何使用 fork() 在多处理环境中处理 Tensorflow 会话?
- ios - 6.5" 显示器的应用商店屏幕截图大小是多少?
- html - 悬停时变暗的叠加层比图像大
- java - 使用 selenium (java) 的自动化
- vba - VBA代码根据带有if条件的列表取消隐藏选项卡
- c++ - 在 C++ 中运行命令,然后在该程序中运行命令
- java - AlertDialog 显示从 RadioButton 选择的结果,让用户再次检查
- c# - 将数据从一张表复制到另一张表 - Oracle
- php - 在 Laravel Blade 中使用 Google AMP 标签
- c# - Hook Mechanic 和同步 Time.Delta Time C#