如何在CMAKE的OSX包中包含库

时间:2017-06-07 19:28:29

标签: c++ macos cmake clion dylib

我正在尝试使用Clion和Cmake构建一个OSX捆绑包,目前该库正确链接我没有预编译错误但是当我构建并尝试运行该程序时出现以下错误


    dyld: Library not loaded: libxl.dylib
    Referenced from: 
    /path/to/executable/
      Reason: image not found

我在这个问题上搜索过,似乎无法找到明确的解决方案,这可能是由于我缺乏CMake和C ++的经验。

如果有人有解决方案或者可以指出我应该阅读的方向以进一步理解这一点,那将非常感激。

请参阅下面的CMakeLists.txt

    cmake_minimum_required(VERSION 3.7)
    project(project name)

    set(CMAKE_CXX_STANDARD 14)

    set(SOURCE_FILES main.cpp)

    find_package( Qt5Core REQUIRED )
    find_package( Qt5Widgets REQUIRED )
    find_package( Qt5Gui REQUIRED )

    set(PROJECT_LINK_LIBS libxl.dylib)
    link_directories(${CMAKE_SOURCE_DIR}/LibXL/lib)
    include_directories(${CMAKE_SOURCE_DIR}/LibXL/include_cpp)


    #Mac Bundle (Built on Mac)
    add_executable(project_target_mac MACOSX_BUNDLE main.cpp)
    qt5_use_modules( project_target_mac Core Widgets Gui )
    target_link_libraries(project_target_mac Qt5::Widgets)
    target_link_libraries(project_target_mac ${PROJECT_LINK_LIBS} )
    #set_target_properties(project_target_mac PROPERTIES INSTALL_RPATH "${CMAKE_SOURCE_DIR}/LibXL/lib")

    add_executable(project_target ${SOURCE_FILES})
    qt5_use_modules( project_target Core Widgets Gui )
    target_link_libraries(project_target Qt5::Widgets)
    target_link_libraries(project_target ${PROJECT_LINK_LIBS

} )

1 个答案:

答案 0 :(得分:0)

在OSX上,人们通常使用Frameworks并将其与安装规则集成到应用程序捆绑包中。

规则如下:

    install( DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/ofxSyphon/libs/Syphon/lib/osx/Syphon.framework"
    DESTINATION ${APP_NAME}.app/Contents/Frameworks")

然后,将Framework文件夹复制到应用程序捆绑包的Contents/Frameworks子文件夹中。 为此,应在应用程序本身中安装以下内容:

install(TARGETS ${APP_NAME} DESTINATION .)

您可能想用CMAKE_INSTALL_PREFIX指定安装前缀,默认值为/usr/local

对于单个库文件,该过程非常相似,但是您还必须调整应用程序的RPATH以添加lib的相对路径,以便可执行文件可以找到它。框架不需要此部分,因为它们具有标准化的文件夹结构,并且可执行文件会对其依赖关系进行查找。