Как включить определенную версию библиотеки C ++ в комплект Mac OS, созданный с помощью CMake / CPack? - PullRequest
0 голосов
/ 20 октября 2019

Я создал приложение, написанное на C ++ 17 и скомпилированное на Mac с последним компилятором и версией MacOS для Catalina. Я использую CMake и CPack, чтобы создать пакет и упаковать его в .dmg. Когда я получаю полученный файл на другом компьютере с Каталиной, тогда все работает. Но при попытке запустить на компьютере, на котором установлена ​​MacOS 10.12, возникает ошибка:

dyld: Symbol not found: __ZNSt19bad_optional_accessD1Ev
Expected in: /usr/lib/libc++.1.dylib

При выделении символа это фактически деструктор для исключения bad_optional_access: std::bad_optional_access::~bad_optional_access()

std::optional был представлен в C ++ 17. Таким образом, на компьютере с MacOS 10.12 этот символ отсутствует в libc ++. Я пытаюсь выяснить, как упаковать libc++.1.dylib для C ++ 17 в пакет, чтобы он не использовал системный.

Для создания моего пакета у меня есть:

# Installation
set(prefix "${PROJECT_NAME}.app/Contents")
set(INSTALL_RUNTIME_DIR "${prefix}/MacOS")
set(INSTALL_CMAKE_DIR "${prefix}/Resources")
set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR})

# based on code from CMake's QtDialog/CMakeLists.txt
macro(install_qt5_plugin _qt_plugin_name _qt_plugins_var _prefix)
    get_target_property(_qt_plugin_path "${_qt_plugin_name}" LOCATION)
    if(EXISTS "${_qt_plugin_path}")
        get_filename_component(_qt_plugin_file "${_qt_plugin_path}" NAME)
        get_filename_component(_qt_plugin_type "${_qt_plugin_path}" PATH)
        get_filename_component(_qt_plugin_type "${_qt_plugin_type}" NAME)
        set(_qt_plugin_dest "${_prefix}/PlugIns/${_qt_plugin_type}")
        install(FILES "${_qt_plugin_path}"
                DESTINATION "${_qt_plugin_dest}")
        set(${_qt_plugins_var}
                "${${_qt_plugins_var}};\$ENV{DEST_DIR}\${CMAKE_INSTALL_PREFIX}/${_qt_plugin_dest}/${_qt_plugin_file}")
    else()
        message(FATAL_ERROR "QT plugin ${_qt_plugin_name} not found")
    endif()
endmacro()

install_qt5_plugin("Qt5::QCocoaIntegrationPlugin" QT_PLUGINS ${prefix})
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/qt.conf"
        "[Paths]\nPlugins = ${_qt_plugin_dir}\n")
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/qt.conf"
        DESTINATION "${INSTALL_CMAKE_DIR}")

# Destination paths below are relative to ${CMAKE_INSTALL_PREFIX}
install(TARGETS ${PROJECT_NAME}
        BUNDLE DESTINATION . COMPONENT Runtime
        RUNTIME DESTINATION ${INSTALL_RUNTIME_DIR} COMPONENT Runtime
        )

# Note Mac specific extension .app
set(APPS "\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${PROJECT_NAME}.app")

# Directories to look for dependencies
set(DIRS "${CMAKE_BINARY_DIR}")

# Path used for searching by FIND_XXX(), with appropriate suffixes added
if(CMAKE_PREFIX_PATH)
    foreach(dir ${CMAKE_PREFIX_PATH})
        list(APPEND DIRS "${dir}/bin" "${dir}/lib")
    endforeach()
endif()


list(APPEND DIRS "$ENV{VULKAN_SDK}/lib")
list(APPEND QT_PLUGINS "${APPS}/Contents/Resources/MoltenVk/lib/libMoltenVK.dylib")
# Append Qt's lib folder which is two levels above Qt5Widgets_DIR
list(APPEND DIRS "${Qt5Widgets_DIR}/../..")

include(InstallRequiredSystemLibraries)

message(STATUS "APPS: ${APPS}")
message(STATUS "QT_PLUGINS: ${QT_PLUGINS}")
message(STATUS "DIRS: ${DIRS}")

install(CODE "include(BundleUtilities)
    fixup_bundle(\"${APPS}\" \"${QT_PLUGINS}\" \"${DIRS}\")")

install(CODE "include(BundleUtilities)
    fixup_bundle(\"${APPS}\" \"${MOLTEN_LIB}\" \"${DIRS}\")")

set(CPACK_GENERATOR "DRAGNDROP")
include(CPack)

Это делает правильную работу для библиотек Qt Vulkan и MoltenVK. Я могу работать на другом компьютере под управлением Catalina, на котором не установлены библиотеки Vulkan и MoltenVk, и запуск otool -L на исполняемом файле показывает, что он использует встроенные библиотеки Qt. Однако это относится к библиотеке /usr/lib/libc++.1.dylib.

Я не понимаю, как правильно встраивать только стандартную библиотеку C ++, которая находится в системной папке / usr / lib, и не включать другие библиотеки из этой папкии убедитесь, что fixup_bundle выполняет правильную работу по обновлению ссылок для этой библиотеки. Буду признателен за помощь, если кто-то знает, как это сделать правильно.

...