ld: 找不到库文件

3
我遇到了一个链接器错误(编译时而非运行时):
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

我觉得我可能只是个白痴,但我看不懂。能帮忙吗?

1个回答

3
你的链接命令显示你使用的是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.dylibliblibobjc.A.dylib.a 等,都不存在于 /usr/lib/ 或任何其他指定或默认的搜索目录中, 在第三和第四次尝试中,libname.(dylib|a) 的解析结果是字符串,甚至不能成为未限定的文件名。

最终的版本显然想要使用 -l:name 来精确搜索 name(等于 /usr/lib/libobjc.A.dylib)。 然而,-l:nameGNU Binutils 链接器 (Linux 中的默认链接器)的选项,并且根据文档,不是 OS X 链接器的选项。(此外,Binutils 链接器的该选项指示链接器在每个目录中搜索具有精确未限定名称 name 的文件,但 /usr/lib/libobjc.A.dylib 不符合此要求)。

要使链接器在 /usr/lib/ 中定位 libobjc.A.dylib,您需要使用以下选项:

-lobjc.A

例如,考虑您链接命令中的其他-l选项:

-lcore -leidos -ltskit -lgsl -leidos_zlib

不过在尝试之前,我建议您检查 /usr/lib 中是否存在符号链接:

libobjc -> libobjc.A

这表明 libobjc.A 是您的工具链配置中选择的 libobjc 的版本,您所需的链接选项只是:the version
-lobjc

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

很棒的答案;我没有意识到ld在不同平台上有如此大的差异,所以我搜索了“man ld”,因为某种原因我的 macOS 系统无法显示ld的 man 页面。关于 libobjc.A 和 libobjc:是的,它们之间有一个符号链接,通常情况下我会使用它,因为我熟悉这种约定。但是 https://developer.apple.com/documentation/objectivec/objective-c_runtime?language=objc 上写着“Objective-C 运行时库... 在 /usr/lib/libobjc.A.dylib 找到的共享库。”这似乎暗示我应该直接链接到 libobjc.A.dylib,出于某种原因...? - bhaller

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