Невозможно запустить приложение, скомпилированное на OS-X Snow Leopard (10.6.7), на другом Mac с использованием OS-X Leopard (10.5.8).Ошибка libstdc ++. 6.dylib - PullRequest
4 голосов
/ 16 июня 2011

Я пытаюсь портировать проект C ++ с использованием C ++ 0x и Ogre на Max OS-X, и я сталкиваюсь с проблемой переносимости между версиями OS-X.

Мне удалось скомпилировать мой проект на MacOS-X 10.6 (Snow Leopard) с использованием GCC 4.6.0 (потому что мне нужен C ++ 0x).Это было сложно (вероятно, потому что я новый пользователь OSX), но наконец скомпилировало его без ошибок.

Я включил все необходимые компоненты, фреймворки, плагины и т. Д., Необходимые в комплект Application.app, и он отлично запускаетсяна этом Mac OS-X 10.6

Но при переносе проекта на мой старый ноутбук, установленный с Mac OS-X 10.5.8, я не могу запустить приложение.

Если я дваждыщелкните по .app, попробуйте запустить и, наконец, значок исчезнет из строки меню, и все.Но если я запускаю исполняемый файл, включенный в .app напрямую, он возвращает следующие ошибки:

MacBook-2:~ root# /var/root/Desktop/MyProject.app/Contents/MacOS/MyProject ; exit;
dyld: lazy symbol binding failed: Symbol not found: __ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_i
  Referenced from: /var/root/Desktop/MyProject.app/Contents/MacOS/../Frameworks/Ogre.framework/Versions/1.7.3/Ogre
  Expected in: /usr/lib/libstdc++.6.dylib

dyld: Symbol not found: __ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_i
  Referenced from: /var/root/Desktop/MyProject.app/Contents/MacOS/../Frameworks/Ogre.framework/Versions/1.7.3/Ogre
  Expected in: /usr/lib/libstdc++.6.dylib

Trace/BPT trap
logout

Вот представление дерева комплекта приложений.

MyProject.app

  • Компоненты
    • ... (Огрские компоненты)
  • Каркасы
    • Огр.framework
  • MacOS
    • MyProject (исполняемый)
  • Плагины
    • ... (плагины Ogre)
  • Ресурсы
    • ... (Ogre .cfg + myassets)

Я сказал Cmake использовать MacOSX10.5.sdk, используя (устанавливается внутри графического интерфейса Cmake, а не внутри CMakeList.txt):

  • CMAKE_OSX_DEPLOYEMENT_TARGET 10.5
  • CMAKE_OSX_SYSROOT /Developer/SDKs/MacOSX10.5.sdk

Но это, похоже, ничего не меняет ...


Файл libstdc ++. Dylib, ссылки на libstdc ++. 6.0.9.dylib на Mac usРедактировать, чтобы скомпилировать приложение, в то время как оно ссылается на libstdc ++. 6.0.4.dylib на Mac, который использовался для проверки переносимости.

Но, как я уже сказал, для использования MacOSX10.5.sdk я подумал, что он будет использовать libstdc ++.6.0.4.dylib во время компиляции, чтобы он мог работать на Mac, установленном с 10.5

Действительно, цель состоит в том, чтобы заставить его работать на втором Mac (и на всех Mac, использующих 10.5+), не меняя ничего наЭто.Просто скачайте и запустите ...

Кто-нибудь может сказать мне, что мне здесь не хватает? (Я не очень хорошо разбираюсь в методах и организации OS-X, поэтому я могпропустил что-то очень простое, не бойтесь быть грубым ^^).

Как указать целевой SDK в Cmake? (недостаточно ли используемых команд Cmake?)


Я использую следующее для компиляции моего проекта:

  • Mac OS-X 10.6.7
  • GCC 4.6.0
  • Cmake2.8-4
  • Огр 1.7.3

Для тестирования проекта я использую следующее:

  • Mac OS-X 10.5.8 (естьустановлены некоторые инструменты разработки. Я думаю, что должен сказать об этом, на случай, если это может помешать работе приложений).

Редактировать:

Как я обнаружил, otool здесь - это возвращенный журнал

Valkeas-Mac:MacOS root# otool -L MyProject 
MyProject:
    @executable_path/../Frameworks/Ogre.framework/Versions/1.7.3/Ogre (compatibility version 0.0.0, current version 1.7.3)
    @executable_path/../Components/libOgreTerrain.dylib (compatibility version 0.0.0, current version 1.7.3)
    /System/Library/Frameworks/Carbon.framework/Versions/A/Carbon (compatibility version 2.0.0, current version 136.0.0)
    /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 12.0.0)
    /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit (compatibility version 1.0.0, current version 275.0.0)
    /opt/local/lib/gcc46/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.15.0)
    /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /opt/local/lib/gcc46/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)
    /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 227.0.0)
    /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 476.19.0)
    /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 949.54.0)
    /System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices (compatibility version 1.0.0, current version 34.0.0)
    /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 677.26.0)
Valkeas-Mac:MacOS root# 

Очевидно, что он ссылается на gcc46libstdc ++. 6.dylib (вероятно, нормально, так как я предполагаю, что этот файл содержит функции C ++ 0x GCC 4.6.0).

Так есть ли какое-нибудь решение?(-static возвращает ошибку, которая говорит, что мне нужна динамическая ...)

Ответы [ 2 ]

4 голосов
/ 16 июня 2011

libstdc++ вы используете от gcc 4.6. Поскольку вы используете C ++ 0x, который недоступен в версии gcc, поставляемой с OS X, неудивительно, что встроенный libstdc++ не работает. Вам необходимо отправить libstdc++.dylib, который вы используете внутри пакета приложения (вы можете поместить его, например, в ваш .app/Contents/Libraries). Используйте install_name_tool, чтобы убедиться, что на него ссылаются, используя относительный путь (используйте @rpath или @executable_path).

1 голос
/ 12 января 2014

Хотя выбранный ответ, вероятно, более практичен для многих, на самом деле это ошибка в наборе инструментов Apple, которая тривиально исправляется очень маленьким патчем. Конечно, неправильно обвинять проблему в использовании C ++ 0x или даже обвинять проблему в использовании различных версий gcc: обычно предполагается, что этот материал работает. Учитывая, как много людей, кажется, испытывают эту проблему как пользователи (судя по поиску в Google), мы надеемся, что это может быть исправлено до версии Xcode 5.1 (хотя, учитывая самодовольную реакцию, которую я получил в прошлом от Apple в отношении простых пятиминутных исправлений) чтобы лучше поддерживать обратную совместимость, я не задерживаю дыхание, я собираюсь подать радар независимо от того, как я считаю это очень важным). Исправление заключается в том, чтобы изменить заголовок ostream, добавив __TARGETING_4_0_DYLIB защиту вокруг реализации оператора << для строк. Я разместил патч на моем сайте по адресу <a href="http://test.saurik.com/apple/ostream1.diff" rel="nofollow">http://test.saurik.com/apple/ostream1.diff.

...