ld: библиотека не найдена для - PullRequest
0 голосов
/ 07 мая 2020

У меня ошибка компоновщика (время компиляции, а не время выполнения):

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 Ответ

1 голос
/ 07 мая 2020

Ваша команда связывания показывает, что ваш компоновщик является компоновщиком OS X. См. Это руководство относительно опции -l:

-lx

Эта опция указывает компоновщику искать libx.dylib или libx. a в пути поиска библиотеки. Если строка x имеет форму yo, то этот файл ищется в тех же местах, но без добавления 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 является опцией для компоновщика 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 наличие символа c ссылка:

libobjc -> libobjc.A

Это будет означать, что libobjc.A - это версия из libobjc что ваша инструментальная цепочка настроена на выбор и что требуемый вариант связывания просто:

-lobjc

Параметр поиска -L/usr/lib/ в любом случае избыточен, поскольку /usr/lib/ является каталогом поиска компоновщика по умолчанию.

...