Xcode 不断在错误的路径上搜索 dylib
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4876740/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Xcode keeps searching dylib at wrong path
提问by david
Thats my error:
那是我的错误:
dyld: Library not loaded: /usr/local/lib/libofa.0.dylib
Referenced from: /sers/david/Projekte/Test/build/Debug/Test.app/Contents/MacOS/Test
Reason: image not found
I've done some research and changed the path inside the dylib with install_name_tool:
我做了一些研究并使用 install_name_tool 更改了 dylib 中的路径:
davids-macbook:Test david$ otool -L libofa.0.0.0.dylib
libofa.0.0.0.dylib:
@executable_path/../Frameworks/libofa.0.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1)
/System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
But Xcode keeps searching for it in /usr/lib/:
但是 Xcode 一直在 /usr/lib/ 中搜索它:
build/Debug/Test.app/Contents/MacOS/Test:
/System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 15.0.0)
/System/Library/Frameworks/AudioToolbox.framework/Versions/A/AudioToolbox (compatibility version 1.0.0, current version 1.0.0)
/opt/local/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)
@executable_path/../Frameworks/TagLib.framework/Versions/A/TagLib (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/QTKit.framework/Versions/A/QTKit (compatibility version 1.0.0, current version 1.0.0)
/opt/local/lib/libexpat.1.dylib (compatibility version 7.0.0, current version 7.2.0)
/System/Library/Frameworks/Quartz.framework/Versions/A/Quartz (compatibility version 1.0.0, current version 1.0.0)
/opt/local/lib/libcurl.4.dylib (compatibility version 7.0.0, current version 7.0.0)
/usr/local/lib/libofa.0.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 103.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 227.0.0)
/System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices (compatibility version 1.0.0, current version 44.0.0)
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 550.29.0)
/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 751.29.0)
/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 1038.32.0)
Is there a way to set this in Xcode??? Thanks
有没有办法在 Xcode 中设置它???谢谢
Edit:The library is not a Xcode project. Its build with ./configure; make
编辑:该库不是 Xcode 项目。它使用 ./configure 构建;制作
回答by mipadi
Normally what I do is this:
通常我做的是这样的:
- Set the Installation Directoryof the library to
@rpath
. This will set the install name to@rpath/libofa.0.0.0.dylib
. If you're building the library yourself, you can set this in Xcode; otherwise, useinstall_name_tool
to change it. - Set the Runpath Search Pathsof the application using the library to the location of the directory containing the library. For example, if you put the library in the app's Frameworks directory, you'd set Runpath Search Pathsto
@executable_path/../Frameworks
(or@loader_path/../Frameworks
).
- 将库的安装目录设置为
@rpath
. 这会将安装名称设置为@rpath/libofa.0.0.0.dylib
. 如果您自己构建库,则可以在 Xcode 中进行设置;否则,使用install_name_tool
更改它。 - 将使用库的应用程序的运行路径搜索路径设置为包含库的目录的位置。例如,如果您将库放在应用程序的 Frameworks 目录中,则应将Runpath Search Paths设置为
@executable_path/../Frameworks
(或@loader_path/../Frameworks
)。
This blog postand this onego into more detail.
回答by itechnician
Make sure to install the command line tools from developer.apple.com and then add the library in your project. Run the following script in your Xcode: Targets ??Build Phases ? Run Scriptand just execute:
确保从 developer.apple.com 安装命令行工具,然后将库添加到您的项目中。在您的 Xcode 中运行以下脚本:Targets ??Build Phases ? 运行脚本并执行:
install_name_tool -id @executable_path/../Frameworks/librayName.dylib "$SRCROOT/librayName.dylib"
Note: NO ' or "" required before dylib name
注意:在dylib名称之前不需要'或“”
回答by NIlesh Srivastava
Before going for solution, you should know what is new with dependent library "dylib" in MAC as compare to dependent library "dll" in windows.
在寻求解决方案之前,您应该知道 MAC 中的依赖库“dylib”与 Windows 中的依赖库“dll”相比有哪些新功能。
The major difference in dylib vs dll is "install name". The install name is a path baked into the dynamic library that says where to find the library at runtime. It does not matter where you copy your dylibs, It will always point to old path(except without changing install name). You can know original search path(install name) by using command as below
dylib 与 dll 的主要区别在于“安装名称”。安装名称是嵌入到动态库中的路径,说明在运行时在哪里可以找到该库。复制 dylib 的位置无关紧要,它始终指向旧路径(除非不更改安装名称)。您可以使用以下命令知道原始搜索路径(安装名称)
otool -L a.dylib
otool -L a.dylib
(just drag dylib in place of a.dylib)
(只需拖动 dylib 代替 a.dylib)
For more detail about install name, refer this link.
有关安装名称的更多详细信息,请参阅此链接。
Now, solution for changing the new location for dylib("install name") is just use install_name_tool
as below
现在,更改 dylib("install name") 的新位置的解决方案install_name_tool
如下所示
install_name_tool -change *old path of dylb* *new path of dylib*
install_name_tool -change *old path of dylb* *new path of dylib*
you can get old path by otool -L
command described above already.(old path i.e. original path)
您可以通过otool -L
上述命令获取旧路径。(旧路径即原始路径)
install_name_tool -change
can change search path of dylib and executable as well.
install_name_tool -change
也可以更改 dylib 和可执行文件的搜索路径。
You can use this in Xcode by writing in Run script
file in your project.
您可以通过Run script
在项目中写入文件来在 Xcode 中使用它。