在 OSX 上使用 sublime 和 g++ 编译 SDL2,链接错误

compiling SDL2 with sublime and g++ on OSX, linking errors

我使用带有 build_system on OSX 的 sublime text 3 来编译一个使用 SDL2 的 c++ 游戏。 该游戏在我的机器上运行,但当我尝试在其他机器上使用它时,找不到 SDL2 库。

如何将 SDL2 框架整合到我的游戏或我自己的游戏文件夹结构中,以便轻松复制到任何机器?

我用这个build_system:

    "build_systems": [
        {
            "name": "Debug",
            "working_dir": "${project_path}",
            "cmd": ["g++ -c src/*.cpp -std=c++14 -m64 -g -Wall -I include && g++ *.o -o bin/debug/main -lSDL2main -lSDL2 -lSDL2_image && ./bin/debug/main"],
            "selector": "source",
            "shell": true

        },
        {
            "name": "Release",
            "working_dir": "${project_path}",
            "cmd": ["g++ -c src/*.cpp -std=c++14 -m64 -O3 -Wall -I include && g++ *.o -o bin/release/main -s -lSDL2main -lSDL2 -lSDL2_image && ./bin/release/main"],
            "selector": "source",
            "shell": true

        }

机器上的错误,未安装SDL2:

dyld: Libary not loaded: /usr/local/opt/sdl2/lib/libSDL2-2.0.0.dylib

我的首选方案是我有一个已编译的游戏 main 和一个子文件夹 libframework,其中包括必要的 SDL2 文件(我也不确定哪个 SDL2这应该是文件)。 感谢您的帮助。

这个 post 帮助我找到了解决方案:Building OSX App Bundle

首先,我需要的文件libSDL2-2.0.0.dylib深埋在系统中/usr/local/Cellar/sdl2/2.0.9_1/lib/libSDL2-2.0.0.dylib

我觉得.dylib后缀说明这是一个动态库文件,也就是说系统只需要安装一次,每个程序都可以使用和共享同一个文件。如果每个人都安装了它,那就太好了。但是当然,如​​果你还没有全局安装SDL库,这个程序是不能运行的。

因此,创建一个应用程序包 main.app 很重要,其中包含所用的库。 main.app 实际上只是一个具有特殊子文件夹结构的特殊文件夹:

main.app/
  Contents/
    Info.plist
    MacOS/
      main
    Resources/

(您可以在上面的其他 Whosebug 答案中了解更多信息) (我在 ./bin/release/ 文件夹中创建了 main.app 文件夹,其中 g++ 输出了发布二进制文件)

打开终端 window 并进入 g++ 输出二进制文件的目录。对我来说是 ./bin/release 使用以下命令,您可以查看您的应用程序使用了哪些库以及您的应用程序在何处查找这些库:

otool -L main

(主要是可执行二进制文件的名称)

我的输出是:

main:
    /usr/local/opt/sdl2/lib/libSDL2-2.0.0.dylib (compatibility version 10.0.0, current version 10.0.0)
    /usr/local/opt/sdl2_image/lib/libSDL2_image-2.0.0.dylib (compatibility version 3.0.0, current version 3.2.0)
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 400.9.4)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.250.1)

所以我必须更改前 2 个,正如另一个答案所述,您必须更改不以 System/Library//usr/lib/.

开头的库

为此,我使用了这 2 个命令:

install_name_tool -change /usr/local/opt/sdl2/lib/libSDL2-2.0.0.dylib @executable_path/libSDL2-2.0.0.dylib main
install_name_tool -change /usr/local/opt/sdl2_image/lib/libSDL2_image-2.0.0.dylib @executable_path/libSDL2_image-2.0.0.dylib main

并将主要的可执行二进制文件移动到包中 main.app/Contents/MacOS; 并将库复制到同一个包目录中:

mv main main.app/Contents/MacOS/
cp /opt/local/lib/libSDL-1.2.0.dylib main.app/Contents/MacOS/
cp /usr/local/opt/sdl2_image/lib/libSDL2_image-2.0.0.dylib main.app/Contents/MacOS/

如果您现在将 main.app 捆绑包复制到另一台计算机,然后双击该应用程序,它应该可以运行。 但这需要手动完成很多工作,所以一个答案谈到了一种自动完成所有这些工作的工具 dylibbundler -> https://github.com/auriamg/macdylibbundler/

此工具会自动更改您的二进制文件中的路径并将所有库复制到它自己的 main.app/Contents/libs 文件夹中,这很好,因为现在您的库与二进制文件分开了,并且它添加了正确的对应路径。

我将 mv main 命令和 dylibbundler 添加到 release build-system 中,如下所示:

{
    "folders":
    [
        {
            "path": "bin/.."
        }
    ],
    "build_systems": [
        {
            "name": "Debug",
            "working_dir": "${project_path}",
            "cmd": ["g++ -c src/*.cpp -std=c++14 -m64 -g -Wall -I include && g++ *.o -o bin/debug/main -lSDL2main -lSDL2 -lSDL2_image && ./bin/debug/main"],
            "selector": "source",
            "shell": true
        },
        {
            "name": "Release",
            "working_dir": "${project_path}",
            "cmd": ["g++ -c src/*.cpp -std=c++14 -m64 -O3 -Wall -I include && g++ *.o -o bin/release/main -lSDL2main -lSDL2 -lSDL2_image && mv bin/release/main bin/release/main.app/Contents/MacOS/ && dylibbundler -od -b -x ./bin/release/main.app/Contents/MacOS/main -d ./bin/release/main.app/Contents/libs/ && ./bin/release/main.app/Contents/MacOS/main"], 
            "selector": "source",
            "shell": true
        }
    ]

}