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

问题描述 投票:0回答:1

我在OSX上将sublime text 3与build_system一起使用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

[我的首选方案是,我有一个带有子文件夹mainlib的编译后的游戏framework,其中包括必要的SDL2文件(我也不知道这应该是哪个SDL2文件)。感谢您的帮助。

c++ compilation sublimetext3 linker-errors sdl-2
1个回答
0
投票
首先,我需要的文件被埋在系统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/

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

打开终端窗口,然后进入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/开头的库。

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

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中;并将这些库复制到相同的bundle目录中:

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 } ] }

© www.soinside.com 2019 - 2024. All rights reserved.