ld: 未找到以下库

问题描述 投票:0回答:1

我遇到了一个链接器错误(编译时,不是运行时)。

ld: library not found for -l:/usr/lib/libobjc.A.dylib

这只是最新版本的错误。 我正试图链接到 /usr/lib/libobjc.A.dylib我想硬编码路径,保证库在我所在的平台上存在于这个路径上。 而它确实存在。

bhaller@lanois % ls -l /usr/lib/libobjc.A.dylib
-rwxr-xr-x  1 root  wheel  859536 Jan 23 08:59 /usr/lib/libobjc.A.dylib

我试过了

-L/usr/lib/ -llibobjc.A.dylib
-L/usr/lib/ -llibobjc.A
-l/usr/lib/libobjc.A.dylib
-l:/usr/lib/libobjc.A.dylib

每一次我都得到同样的错误, ld找不到这个库. 但它就在那里,而且我给出了它的完整路径!我错过了什么? 我到底漏了什么?

这里是完整的调用,还有一堆其他的废话。

"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -lto_library /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib -dynamic -arch x86_64 -headerpad_max_install_names -macosx_version_min 10.10.0 -o QtSLiM.app/Contents/MacOS/QtSLiM -L/Users/bhaller/Desktop/QtSLiM QMAKE/QtSLiM/../core/ -L/Users/bhaller/Desktop/QtSLiM QMAKE/QtSLiM/../eidos/ -L/Users/bhaller/Desktop/QtSLiM QMAKE/QtSLiM/../treerec/tskit/ -L/Users/bhaller/Desktop/QtSLiM QMAKE/QtSLiM/../gsl/ -L/Users/bhaller/Desktop/QtSLiM QMAKE/QtSLiM/../eidos_zlib/ -syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -rpath @executable_path/Frameworks -rpath /Users/bhaller/Qt5.9.8/5.9.8/clang_64/lib main.o QtSLiMWindow.o QtSLiMAppDelegate.o QtSLiMWindow_glue.o QtSLiMChromosomeWidget.o QtSLiMExtras.o QtSLiMPopulationTable.o QtSLiMIndividualsWidget.o QtSLiMEidosPrettyprinter.o QtSLiMAbout.o QtSLiMPreferences.o QtSLiMSyntaxHighlighting.o QtSLiMFindRecipe.o QtSLiMHelpWindow.o QtSLiMScriptTextEdit.o QtSLiMEidosConsole.o QtSLiMEidosConsole_glue.o QtSLiMConsoleTextEdit.o QtSLiM_SLiMgui.o QtSLiMTablesDrawer.o QtSLiMFindPanel.o QtSLiMGraphView.o QtSLiMGraphView_FixationTimeHistogram.o QtSLiMGraphView_FrequencySpectra.o QtSLiMGraphView_LossTimeHistogram.o QtSLiMGraphView_PopulationVisualization.o QtSLiMGraphView_FitnessOverTime.o QtSLiMGraphView_FrequencyTrajectory.o QtSLiMHaplotypeManager.o QtSLiMHaplotypeOptions.o QtSLiMHaplotypeProgress.o QtSLiMVariableBrowser.o qrc_buttons.o qrc_icons.o qrc_recipes.o qrc_help.o moc_QtSLiMWindow.o moc_QtSLiMAppDelegate.o moc_QtSLiMChromosomeWidget.o moc_QtSLiMExtras.o moc_QtSLiMPopulationTable.o moc_QtSLiMIndividualsWidget.o moc_QtSLiMAbout.o moc_QtSLiMPreferences.o moc_QtSLiMSyntaxHighlighting.o moc_QtSLiMFindRecipe.o moc_QtSLiMHelpWindow.o moc_QtSLiMScriptTextEdit.o moc_QtSLiMEidosConsole.o moc_QtSLiMConsoleTextEdit.o moc_QtSLiMTablesDrawer.o moc_QtSLiMFindPanel.o moc_QtSLiMGraphView.o moc_QtSLiMGraphView_FixationTimeHistogram.o moc_QtSLiMGraphView_FrequencySpectra.o moc_QtSLiMGraphView_LossTimeHistogram.o moc_QtSLiMGraphView_PopulationVisualization.o moc_QtSLiMGraphView_FitnessOverTime.o moc_QtSLiMGraphView_FrequencyTrajectory.o moc_QtSLiMHaplotypeManager.o moc_QtSLiMHaplotypeOptions.o moc_QtSLiMHaplotypeProgress.o moc_QtSLiMVariableBrowser.o -lcore -leidos -ltskit -lgsl -leidos_zlib -l:/usr/lib/libobjc.A.dylib -framework QtOpenGL -framework QtWidgets -framework QtGui -framework QtCore -framework DiskArbitration -framework IOKit -framework OpenGL -framework AGL -lc++ -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/11.0.0/lib/darwin/libclang_rt.osx.a -F/Users/bhaller/Qt5.9.8/5.9.8/clang_64/lib
ld: library not found for -l:/usr/lib/libobjc.A.dylib
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[1]: *** [QtSLiM.app/Contents/MacOS/QtSLiM] Error 1
make: *** [sub-QtSLiM-make_first] Error 2

我觉得我一定是个白痴,但我看不到它。 救命啊?

linker ld
1个回答
1
投票

你的链接命令显示你的链接器是OS X链接器。请参考它的 手册关于 -l 选项。

-lx

这个选项告诉链接器在库搜索路径中搜索libx.dylib或libx.a。 如果字符串 x 的形式是 y.o,那么在相同的地方搜索该文件,但不需要预输入 lib 或附加 .a.dylib 的文件名。

这将告诉你为什么所有的。

-L/usr/lib/ -llibobjc.A.dylib
-L/usr/lib/ -llibobjc.A
-l/usr/lib/libobjc.A.dylib
-l:/usr/lib/libobjc.A.dylib

都是错误的。在你的每一次尝试中,在 name 是您在 -l,链接器将被引导到寻找 libname.dyliblibname.a. 其中有一个文件--例如: liblibobjc.A.dylib.dylib,liblibobjc.A.dylib.a - 存在于 /usr/lib/ 或任何其他指定或默认的搜索目录,并在第三次和第四次尝试中。libname.(dylib|a) 解析到的字符串甚至不可能是不限定的文件名。

你的最后一个变化显然是想用 -l:name 试图让linkersech精确地进行搜索。name ( = /usr/lib/libobjc.A.dylib). 然而,-l:name 是一个选项,用于 GNU Binutils链接器(Linux中的默认链接器),而根据文档,OS X链接器没有这个选项。(此外,Binutils链接器的那个选项会引导链接器在每个目录中搜索一个具有准确的非限定名称的文件。name,其中 /usr/lib/libobjc.A.dylib不能)。)

为了让链接器定位到 libobjc.A.dylib/usr/lib/ 你需要这个选项。

-lobjc.A

例如考虑其他 -l 选项。

-lcore -leidos -ltskit -lgsl -leidos_zlib

不过在你尝试之前,我建议你先检查一下... /usr/lib 符号联系的存在。

libobjc -> libobjc.A

这将表明: libobjc.Alibobjc 你的工具链配置为选择,你所需要的链接选项是简单的。

-lobjc

搜索选项 -L/usr/lib/ 在任何情况下都是多余的,因为 /usr/lib/ 是一个默认的linker搜索目录。

© www.soinside.com 2019 - 2024. All rights reserved.