我使用的是 mac os sonoma 14.2.1 并且 xcode-select 已完全更新。我从网站上下载了.dmg版本的SDL2并将其放在/Library/Frameworks中。
这是我尝试运行的代码:
// On linux compile with:
// g++ -std=c++17 main.cpp -o prog -lSDL2
// C++ Standard Libraries
#include <iostream>
// Third-party library
#include <SDL.h>
int main(int argc, char* argv[]){
if(SDL_Init(SDL_INIT_VIDEO) < 0){
std::cout << "SDL could not be initialized: " <<
SDL_GetError();
}else{
std::cout << "SDL video system is ready to go\n";
}
return 0;
}
我用这个命令成功编译了它:
clang++ main.cpp -I/Library/Frameworks/SDL2.framework/Headers -F/Library/Frameworks -framework SDL2
当我运行 a.out 文件时,出现此错误:
dyld[995]: Library not loaded: @rpath/SDL2.framework/Versions/A/SDL2
Referenced from: <AE1C0174-AA36-3B1F-A430-56DE38E61E1B> /Users/<myname>/Desktop/sdl_tutorial/source/1_Introduction_to_SDL/a.out
Reason: no LC_RPATH's found
zsh: abort ./a.out
我对 rpaths 做了一些研究,但我没有足够的背景来完全理解它。这是 xcode、clang 或 macOS 中的某种错误吗?
您应该包括
<SDL2/SDL.h>
而不是 <SDL.h>
,那么您就不需要 -I/Library/Frameworks/SDL2.framework/Headers
当我升级到 Ventura 时,我发现以前有效的程序开始失败,并显示
dyld[...]: Symbol not found: _SDL_AllocFormat
。 otool -L a.out
显示
@rpath/SDL2.framework/Versions/A/SDL2 (compatibility version 3001.0.0, current version 3001.2.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1336.61.1)
正如预期的那样,但是
otool -l a.out | grep -i rpath
显示
name @rpath/SDL2.framework/Versions/A/SDL2 (offset 24)
没有
LC_RPATH
条目 - 这也是您所看到的,尽管索诺玛有更好的错误消息。因此,解决此问题的一个方法是将 -rpath /Library/Frameworks
添加到您的链接步骤(或编译/链接步骤,在您的情况下)。
我认为不自动将 LC_RPATH 规范添加到依赖 -F/-framework 的代码中是一个错误,但不是我的调用。