Этот пост помог мне найти решение: Сборка приложения 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
}
]
}