CMake, OSX, @rpath и ссылки на фреймворки

Я потратил неделю на то, чтобы заставить что-то, с чем я работал на Linux, работать на OSX, но безрезультатно. Я попытался прочитать статью CMake на rpath и другие посты SO, касающиеся этого, и покопаться в моем CMakeLists.txt, чтобы заставить его работать, но мне не удалось, и я надеюсь, что кто-то может дать мне некоторые подсказки здесь что я делаю не так

# CMake 2.8.11 and above required for linking to qtmain.lib library on Windows
# CMake 2.8.12 and above required for MACOSX_RPATH property
cmake_minimum_required(VERSION 2.8.12)
set(PROJECT_NAME "maya_standalone_test")

if(APPLE)
    message(STATUS "Setting MacOSX SDK...")
    set(CMAKE_OSX_SYSROOT "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk")
endif(APPLE)

project(${PROJECT_NAME})

set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/modules)

# Attempt to find existing installation of Maya and define variables
find_package(Maya REQUIRED)

# Add include search paths
include_directories(
  ${MAYA_INCLUDE_DIR}
  ${PROJECT_SOURCE_DIR}/include
)

if(APPLE)
    message(STATUS "Setting OSX Framework path to: ${MAYA_LOCATION}/Maya.app/Contents/Frameworks")
    set(CMAKE_FIND_FRAMEWORK FIRST)
    set(CMAKE_FRAMEWORK_PATH "${MAYA_LOCATION}/Maya.app/Contents/Frameworks")
endif(APPLE)

# Set compiler flags for each platform
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
    message(STATUS "Detected compiler as Clang...")
    # Using Clang 
    set(CMAKE_CXX_FLAGS "-stdlib=libstdc++ \
                        -std=c++0x \
                        -fno-gnu-keywords \
                        -fpascal-strings \
                        -O3 \
                        -dynamic")
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} -ggdb -glldb")
    set(CMAKE_EXE_LINKER_FLAGS "-stdlib=libstdc++ \
                                -std=c++0x \
                                -fno-gnu-keywords \
                                -fpascal-strings \
                                -O3 \
                                -Wl, \
                                -headerpad_max_install_names \
                                -dynamic")

elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
    # using GCC on Linux
    set(CMAKE_C_FLAGS "-DBits64_ \
                      -m64 \
                      -DUNIX \
                      -D_BOOL \
                      -DLINUX \
                      -DFUNCPROTO \
                      -D_GNU_SOURCE \
                      -DLINUX_64 \
                      -fPIC \
                      -fno-strict-aliasing \
                      -DREQUIRE_IOSTREAM \
                      -O3 \
                      -Wall \
                      -Wno-multichar \
                      -Wno-comment \
                      -Wno-sign-compare \
                      -funsigned-char \
                      -pthread")
    set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} \
                        -Wno-deprecated \
                        -Wno-reorder \
                        -ftemplate-depth-25 \
                        -fno-gnu-keywords")
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} -ggdb")

elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
    # using Visual Studio C++
    # TODO: Need to find the compiler flags 
    set(CMAKE_CXX_FLAGS "/MP")
    set(CMAKE_CXX_FLAGS_DEBUG "/MP /ZI /EHsc")
endif()

# Add project sources
add_subdirectory(src)

# Don't skip the full RPATH for the build/install tree
set(CMAKE_SKIP_RPATH FALSE)
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)

if(APPLE)
    message (STATUS "Setting OSX-specific settings...")
    set(CMAKE_INSTALL_RPATH "${MAYA_LIBRARY_DIR}")
    set(CMAKE_INSTALL_NAME_DIR "@rpath")
else()
    # Disable RPATH stripping during installation so that the binary will link correctly
    # to the Maya libs
    set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
endif(APPLE)

set(EXECUTABLE_NAME ${PROJECT_NAME})
add_executable (${EXECUTABLE_NAME} ${PROJECT_SOURCES})

# Set preprocessor definitions
set_target_properties(${EXECUTABLE_NAME} PROPERTIES
    COMPILE_DEFINITIONS "${MAYA_COMPILE_DEFINITIONS}")

# Link the executable to the libraries
message(STATUS "Linking to Maya libraries at: ${MAYA_LIBRARY_DIR}")
target_link_libraries(${EXECUTABLE_NAME} ${MAYA_LIBRARIES})

install(TARGETS ${EXECUTABLE_NAME} DESTINATION ${PROJECT_SOURCE_DIR}/bin)

Получившийся исполняемый файл, когда я проверяю с помощью otool, дает мне:

Load command 41
          cmd LC_RPATH
      cmdsize 72
         path /Applications/Autodesk/maya2016/Maya.app/Contents/MacOS (offset 12)

Это правильно, но пути к библиотекам:

../bin/maya_standalone_test:
    @executable_path/libOpenMaya.dylib (compatibility version 0.0.0, current version 0.0.0)
    @executable_path/libOpenMayaAnim.dylib (compatibility version 0.0.0, current version 0.0.0)
    @executable_path/libOpenMayaFX.dylib (compatibility version 0.0.0, current version 0.0.0)
    @executable_path/libOpenMayaRender.dylib (compatibility version 0.0.0, current version 0.0.0)
    @executable_path/libOpenMayaUI.dylib (compatibility version 0.0.0, current version 0.0.0)
    @executable_path/libFoundation.dylib (compatibility version 0.0.0, current version 0.0.0)
    @executable_path/libclew.dylib (compatibility version 0.0.0, current version 0.0.0)
    @executable_path/libAnimSlice.dylib (compatibility version 0.0.0, current version 0.0.0)
    @executable_path/libDeformSlice.dylib (compatibility version 0.0.0, current version 0.0.0)
    @executable_path/libModifiers.dylib (compatibility version 0.0.0, current version 0.0.0)
    @executable_path/libDynSlice.dylib (compatibility version 0.0.0, current version 0.0.0)
    @executable_path/libKinSlice.dylib (compatibility version 0.0.0, current version 0.0.0)
    @executable_path/libModelSlice.dylib (compatibility version 0.0.0, current version 0.0.0)
    @executable_path/libNurbsSlice.dylib (compatibility version 0.0.0, current version 0.0.0)
    @executable_path/libPolySlice.dylib (compatibility version 0.0.0, current version 0.0.0)
    @executable_path/libProjectSlice.dylib (compatibility version 0.0.0, current version 0.0.0)
    @executable_path/libImage.dylib (compatibility version 0.0.0, current version 0.0.0)
    @executable_path/libShared.dylib (compatibility version 0.0.0, current version 0.0.0)
    @executable_path/libTranslators.dylib (compatibility version 0.0.0, current version 0.0.0)
    @executable_path/libDataModel.dylib (compatibility version 0.0.0, current version 0.0.0)
    @executable_path/libRenderModel.dylib (compatibility version 0.0.0, current version 0.0.0)
    @executable_path/libNurbsEngine.dylib (compatibility version 0.0.0, current version 0.0.0)
    @executable_path/libDependEngine.dylib (compatibility version 0.0.0, current version 0.0.0)
    @executable_path/libCommandEngine.dylib (compatibility version 0.0.0, current version 0.0.0)
    @executable_path/libIMFbase.dylib (compatibility version 0.0.0, current version 0.0.0)
    /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 104.1.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)

И, конечно же, когда я запускаю приложение, я получаю:

dyld: Library not loaded: @executable_path/libOpenMaya.dylib
  Referenced from: /Users/sonictk/Git/experiments/maya_standalone_app_example/build/../bin/maya_standalone_test
  Reason: image not found
[1]    16909 trace trap  ../bin/maya_standalone_test

Я попытался использовать команду post build, чтобы вместо @executable_path изменить значение @rpath для каждой библиотеки, но пока он нашел библиотеки, у меня возникли проблемы с тем, что исполняемый файл не может найти фреймворки (расположенные в ${MAYA_LOCATION}/Maya.app/Contents/Frameworks) и другие проблемы, связанные с другими динамическими библиотеками в той же папке (например, Maya QtCore и т. д.)

Это все работает, конечно, если я копирую Frameworks/ папка в родительский каталог моего исполняемого файла и все файлы из ${MAYA_LIBRARY_DIR} в ту же папку, что и исполняемый файл, или если я установил DYLD_LIBARY_PATH а также DYLD_FRAMEWORK_PATH указать на директории библиотеки и фреймворка перед запуском моего исполняемого файла. Но я хотел бы, чтобы эти библиотеки и платформы в OSX были динамически связаны без необходимости изменять среду, как я делаю в Linux.

Что я здесь не так делаю?

0 ответов

Другие вопросы по тегам