【问题标题】:Compiling in a dynamic C library (dylib) into a program on OS X在 OS X 上将动态 C 库 (dylib) 编译成程序
【发布时间】:2017-08-01 17:27:20
【问题描述】:

我编写了一个使用libusb 的小C 程序。现在我想将此程序分发给“普通”(而非开发)Mac OS X 计算机。但是当我将编译后的文件移植到测试机器时,我得到了以下错误:

dyld: Library not loaded: /opt/local/lib/libusb-0.1.4.dylib
  Referenced from: /Users/kitty/myprogram
  Reason: image not found
Trace/BPT trap: 5

当我复制文件时(仅适用于所有文件)

/opt/local/lib/libusb-0.1.4.dylib   /opt/local/lib/libusb-1.0.a     
/opt/local/lib/libusb.a
/opt/local/lib/libusb-1.0.0.dylib   /opt/local/lib/libusb-1.0.dylib     
/opt/local/lib/libusb.dylib

从我的机器到目标机器,程序完美运行。

但我真的很想将所有内容创建或编译成一个可执行文件。这怎么可能?

在编译时使用-static 不起作用,因为并非所有库都可以静态编译到最终应用程序中(请参阅this SO question here)。

那么我怎样才能制作一个整洁的小应用程序文件呢?

【问题讨论】:

    标签: c macos static-linking


    【解决方案1】:

    你可以convert a static library to a dynamic library,但我不知道有什么方法可以按照你的意愿做相反的事情。

    如果您要使用捆绑包构建应用程序,则需要将要分发的库放在捆绑包中的 Frameworks 目录中,并链接到该目录。

    如果您不是构建基于捆绑包的应用程序,只是一个二进制文件,您可能需要为您的用户提供有关如何在他们的系统上安装库的说明(例如通过 Homebrew)。

    以下是基于捆绑包的应用的操作方法:

    Apple 有一个document about run-path dependent libraries,但实际上并没有解释如何为新手设置它。

    它的工作原理如下:

    • 将您要使用的libusb.dylib 添加到您的项目中。
    • 它应该会自动添加到您项目的“构建阶段”中的“Link Binary with Libraries”阶段。如果没有,请在此处添加。
    • 添加一个新的“复制文件”构建阶段。
      • “目标”下拉框中,选择“框架”。这是 应用最终捆绑包中的 Frameworks 目录。
      • 然后在该复制构建阶段按 “+” 图标并添加您的库。
    • 如果您有任何手动链接选项,例如 -L/usr/local/lib-lusb,请将其删除。
    • 清理和构建。

    当您现在查看您的应用程序包时,您会看到该库已复制到 <bundle_path>/Contents/Frameworks/。您现在可以从任意位置启动应用程序,动态链接加载器知道它需要查看 <path_to_binary>/../Frameworks/ 才能找到您的库。

    但是:您可能需要重建您的libusb 以将install_name 设置为@rpath/../Frameworks/libusb.dylib 或使用install_name_tool CLI 工具修复您的libusb.dylib 副本的路径你添加到你的项目中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-10
      • 2014-09-06
      • 2011-07-08
      • 1970-01-01
      • 2015-11-24
      • 1970-01-01
      • 1970-01-01
      • 2012-01-03
      相关资源
      最近更新 更多