我该如何在Xcode中链接动态库?

9

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

我已经在Xcode中构建并运行该程序,它返回以下信息:

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个回答

4

我刚刚完成了一个模块捆绑项目,与一个独立的可执行文件组成一个更大的项目。

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

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。因此我不得不在目标文件的开头添加另一个运行脚本阶段来修复这里的安装名称:
install_name_tool -change libBillyIdol.dylib @executable_path/../Plugins/FooBar.bundle/Contents/Frameworks/Foobar/libBillyIdol.dylib local/path/to/libBobDylan.dylib

我需要将超过十二个这样的链接进行关联。我必须说服dylibs的供应商扩充他们的头文件以适应我的多个install_name更改。


2
如果我正确理解了您的问题,您的应用程序构建正常,在链接时没有错误,但是当您尝试启动它时,库无法找到。
这并不奇怪,因为dylib文件位于某个任意目录而不在系统路径上。您需要将其复制到/usr/lib中(可能不是一个好主意),或者将其包含在应用程序包中。后者可能是更好的方法。
我从未尝试过,但显然您需要使用复制文件构建阶段将dylib放入您的包中,然后配置Xcode以便您的可执行文件知道在哪里找到它。

1
如果您正在构建没有捆绑包的可执行文件,该怎么办? - Jay

0

你只需要将库从目录中拖到Xcode项目中,最好放在资源文件夹中,但我认为这并不重要。我尝试过勾选和不勾选“将文件复制到捆绑包中”,两种情况都可以工作,不确定是否需要将其包含在捆绑包中以进行部署。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接