如何在Xcode中链接动态库?

时间:2009-03-12 01:37:15

标签: c++ xcode macos dylib

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

我构建它并在x-code中运行它然后吐出来:

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中最好/最优雅/最容易做的事情吗?

3 个答案:

答案 0 :(得分:4)

我刚刚使用Module Bundle项目完成了这项工作。这被包含在一个带有单独可执行文件的大型项目中。

我添加了“将dylibs复制到框架”步骤,该步骤将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

我有十几个这样的人要反对;我不得不说服dylibs的供应商填充标题以适应我的许多install_name更改......

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:0)

你只需将库从目录拖到你的Xcode项目上,最好是资源但是没关系(我相信)。我尝试使用和不检查'将文件复制到软件包',它在两种情况下均可用,不确定是否需要将其包含在软件包中进行部署。

我用sqlite3和cocoa应用程序(可可触摸)测试了这个。