Как GNU Linker выбрать, какую динамическую библиотеку связать - PullRequest
0 голосов
/ 03 декабря 2018

Я использовал gpgpu-sim, симулятор GPU, для проведения исследований.В моей папке несколько файлов .so: My own folder

В папке cudart lib от Nvidia есть несколько вариантов .so: Nvidia's folder

И некоторые .o файлы и должны быть связаны с libcudart.so, когда я набираю команду:

g++ -L "Path/to/MyFolder" -l cudart *.o

Я надеюсь, что сгенерированный a.out будет ссылаться на libcudart.so, но он просто связан со страннымfile:

    libcudart_gpgpu-sim_git-commit-6443f21d433f1b642003867e56fe1f54efae55e3_modified_0.so => not found

И когда я набрал этот код:

g++ -L "Path/to/NvidiaFolder" -l cudart *.o

Программа может найти libcudart.so.9 в моей папке LD_LIBRARY_PATH, но она показывает, что версия может 't match!:

./a.out: /path/to/myFolder/libcudart.so.9.0: version `libcudart.so.9.0'not found (required by ./a.out) 

Кто-нибудь может сказать мне, как работает ld и как решить эти проблемы?

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Я наконец выяснил причину.если вы используете этот код для связывания объектов для создания общей библиотеки:

g++ -shared -Wl,-soname,libNAME_A.so -o libNAME_B.so

тогда, если кто-то пытается связать NAME_B.so, используя:

g++ <INPUT> -lNAME_B -o <OUTPUT>

, вывод будет окончательноищите libNAME_A.so.

см. справочную страницу g ++:

   -Wl,option
       Pass option as an option to the linker.  If option contains commas,
       it is split into multiple options at the commas.  You can use this
       syntax to pass an argument to the option.  For example,
       -Wl,-Map,output.map passes -Map output.map to the linker.  When
       using the GNU linker, you can also get the same effect with
       -Wl,-Map=output.map.

и справочную страницу ld:

-soname=name
       When creating an ELF shared object, set the internal DT_SONAME
       field to the specified name.  When an executable is linked with a
       shared object which has a DT_SONAME field, then when the executable
       is run the dynamic linker will attempt to load the shared object
       specified by the DT_SONAME field rather than the using the file
       name given to the linker.
0 голосов
/ 03 декабря 2018

Здесь нет ничего общего с CUDA, это просто проблема компоновки и настройки среды выполнения.

Компоновщик ld ищет объекты и библиотечные архивы в порядке, заданном параметрами опции -L, и только послев системные каталоги по умолчанию.Компоновщик свяжет объектный код, который сначала соответствует этому поиску.

Во время выполнения, если вы связались с динамическими библиотеками (.so файлами), вам нужно будет правильно определить переменную среды LD_LIBRARY_PATH со списком путей для поискадля динамических библиотек, разделенных двоеточием (:).

Так что, если вы связываетесь с вашими объектами, используя библиотеки из вашего локального пути (при условии, что вы ищете libcudart.so):

g++  -o myprogram *.o -L "/Path/to/myFolder" -lcudart

Вам нужно установить LD_LIBRARY_PATH следующим образом перед запуском вашей программы:

export LD_LIBRARY_PATH="/Path/to/myFolder:$LD_LIBRARY_PATH"
./myprogram

Я надеюсь, что это поможет и прояснит ваше понимание.Честно говоря, я не понимаю происхождение вашего соответствия libcudart_gpgpu-sim_git-commit

...