2017-03-11 83 views
1

我写了一个使用libusb的C程序。现在我想分发这个程序到“普通”(非开发)Mac OS X电脑。但是,当我移植了编译的文件到测试机器,我得到了以下错误:在动态C库(dylib)中编译为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)。

那么我该如何制作一个整洁的小应用程序文件?

回答

1

您可以convert a static library to a dynamic library,但我不知道有一种方法可以根据需要进行相反操作。

如果您正在构建一个捆绑应用程序,则需要将要分发的库放入捆绑软件包中,位于Frameworks目录中,然后进行链接。

如果构建基于捆的应用程序,只是一个单一的二进制文件,你可能需要对如何将他们的系统上安装库中的用户(例如,通过自制)的说明。

这里是你如何对基于包,应用程序做到这一点:

苹果有document about run-path dependent libraries但实际上并没有解释如何设置这一个新手。

下面是它如何工作:

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

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

但是:你可能需要重建libusbinstall_name设置为@rpath/../Frameworks/libusb.dylib或使用install_name_tool CLI工具解决您的libusb.dylib副本,您添加到您的项目路径。