компиляция SDL2 с возвышенным и g ++ на OSX, связывание ошибок - PullRequest
0 голосов
/ 21 марта 2020

Я использую возвышенный текст 3 с системой build_system на OSX, чтобы скомпилировать игру для c ++ с использованием SDL2. Игра работает на моем компьютере, но как только я пытаюсь использовать ее на другом компьютере, библиотека 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 с подпапкой lib или framework, которая включает в себя необходимые файлы SDL2 (я также не уверен, какие это должны быть файлы SDL2). Спасибо за любую помощь.

1 Ответ

0 голосов
/ 24 марта 2020

Этот пост помог мне найти решение: Сборка приложения OSX

Во-первых, мне нужен был файл libSDL2-2.0.0.dylib глубоко в системе /usr/local/Cellar/sdl2/2.0.9_1/lib/libSDL2-2.0.0.dylib

Я думаю, что суффикс .dylib показывает, что это динамический файл библиотеки c, что означает, что его нужно установить в системе только один раз, и каждая программа может использовать и совместно использовать одни и те же файлы. Что делает его довольно хорошим, если все установили его. Но, конечно, если вы не установили библиотеку SDL глобально, программа не будет работать.

Поэтому важно создать комплект приложений main.app, в который будут включены используемые библиотеки. , main.app - это на самом деле просто специальная папка со специальной структурой подпапок:

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

(вы можете узнать больше об этом в другом ответе stackoverflow выше) (я создал папку main.app в моем ./bin/release/ папка, где g ++ выводит двоичные файлы выпуска)

Откройте окно терминала и go в каталог, где g++ выведет ваш двоичный файл. Для меня это ./bin/release С помощью следующей команды вы можете увидеть, какие библиотеки использует ваше приложение и где ваше приложение ищет библиотеки:

otool -L main

(main ist имя исполняемого двоичного файла)

Мой вывод был:

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 в релизную систему сборки следующим образом:

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

}
...