【问题标题】:How can I link a dynamic library in Xcode?如何在 Xcode 中链接动态库?
【发布时间】:2010-10-12 19:58:41
【问题描述】:

我目前正在使用 Qt 开发一个程序,它使用库 libqextserialport.1.dylib。

我构建它并在 x 代码中运行它会吐回:

dyld: Library not loaded: libqextserialport.1.dylib
    Referenced from: /Users/samuelreh/Desktop/QtOpenCV/build/Debug/QtOpenCV.app/Contents/MacOS/QtOpenCV
    Reason: image not found

该库位于 /Users/samuelreh/Desktop/QtOpenCV/qextserialport/build/。

我可以通过切换到可执行文件夹 /Users/samuelreh/Desktop/QtOpenCV/build/Debug/QtOpenCV.app/Contents/MacOS/ 来运行我的程序并输入:

install_name_tool -change libqextserialport.1.dylib /Users/samuelreh/Desktop/QtOpenCV/qextserialport/build/libqextserialport.1.dylib QtOpenCV

我知道除此之外可能还有很多解决方案。有人知道 x-code 中最好的/最优雅的/最容易做到的吗?

【问题讨论】:

    标签: c++ xcode macos dylib


    【解决方案1】:

    我刚刚通过模块捆绑项目完成了这项工作。这被包含在一个带有单独可执行文件的更大项目中。

    我添加了“将 dylib 复制到框架”步骤,它将 dylib 复制到 /Foobar.bundle/Contents/Frameworks/Foobar/。然后我添加了一个运行脚本阶段作为最后一步运行,以修复可执行文件中 dylib 的安装名称:

    install_name_tool -change libBobDylan.dylib @executable_path/../Plugins/Foobar.bundle/Contents/Frameworks/Foobar/libBobDylan.dylib path/to/build/product/Foobar.Bundle/Contents/MacOS/Foobar
    

    当然,libBobDylan.dylib 也链接到 libBillyIdol.dylib。所以我不得不在 Target 的最开始添加另一个 Run Script Phase 来修复这里的安装名称:

    install_name_tool -change libBillyIdol.dylib @executable_path/../Plugins/FooBar.bundle/Contents/Frameworks/Foobar/libBillyIdol.dylib local/path/to/libBobDylan.dylib
    

    我有十几个这样的链接;我不得不说服 dylib 的供应商填充他们的标题以适应我的许多 install_name 更改...

    【讨论】:

      【解决方案2】:

      如果我正确理解您的问题,您的应用程序构建良好,链接时没有错误,但是当您尝试启动它时找不到库。

      这并不奇怪,因为 dylib 文件位于系统路径之外的任意目录中。您要么需要将其复制到/usr/lib(可能不是一个好主意),要么将其包含在应用程序包中。后者可能是更好的方法。

      我从未尝试过,但显然您需要使用 Copy Files Build Phase 将 dylib 放入您的包中,然后使用 configure Xcode 以便您的可执行文件知道在哪里找到它。

      【讨论】:

      • 如果您正在构建一个没有捆绑包的可执行文件怎么办?
      【解决方案3】:

      您只需将库从目录拖到您的 Xcode 项目中,最好拖到资源中,但这并不重要(我相信)。我尝试了检查和不检查“将文件复制到包中”,它在两种情况下都有效,不确定是否需要将其包含在包中以进行部署。

      我已经使用 sqlite3 和 cocoa 应用程序 (cocoa-touch) 对此进行了测试。

      【讨论】:

        猜你喜欢
        • 2014-12-09
        • 2018-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-31
        • 2021-11-06
        • 1970-01-01
        • 2010-10-01
        相关资源
        最近更新 更多