Linker ld:找不到的库

Linker ld:找不到的库,linker,ld,Linker,Ld,我遇到链接器错误(编译时,而不是运行时): 这只是错误的最新版本。我试图链接/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

我遇到链接器错误(编译时,而不是运行时):

这只是错误的最新版本。我试图链接
/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

我觉得我一定是个白痴,但我看不出来。帮助?

您的链接命令显示您的链接器是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.dylib
libname.a
。当然 这些文件(例如,
liblibobjc.A.dylib.dylib
liblibobjc.A.dylib.A
)均不存在 在
/usr/lib/
或任何其他指定或默认搜索目录中,以及 在第三次和第四次尝试中,
libname.(dylib | a)
解析为 甚至不可能是非限定文件名

您的最后一个变体显然希望使用
-l:name
来尝试创建链接器 精确搜索
name
(=
/usr/lib/libobjc.A.dylib
)。然而,
-l:name
是的一个选项,(Linux中的默认链接器) 根据文档,不是OSX链接器的选项。(此外,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
的版本 配置为选择,并且您需要的链接选项仅为:

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

答案很好;我没有意识到
ld
在不同的平台上是如此的不同,我在谷歌上搜索了“manld”,因为出于某种原因,我的macOS系统不会向我显示
ld
的手册页。关于libobjc.A和libobjc:是的,有一个符号链接,通常我会使用它,因为我熟悉这个约定。但是说“Objective-C运行时库…在/usr/lib/libobjc.A.dylib中找到的共享库。”这似乎表明,出于某种原因,我应该直接链接libobjc.A.dylib。。。?
-lobjc