cmake RPATH применяется только к первой зависимости - PullRequest
0 голосов
/ 10 ноября 2018

Я работал над компиляцией исполняемого файла, который имеет 2 зависимости общего объекта. Я сохранил оба .so-файла в том же каталоге, что и исполняемый файл, поэтому я установил свойство INSTALL_RPATH моего исполняемого файла равным «$ ORIGIN», и он успешно находит одну библиотеку, но не другую.

set_property(TARGET testExecutable PROPERTY INSTALL_RPATH "$ORIGIN")

Я использовал LD_DEBUG, чтобы помочь решить проблему. Первая зависимость расположена, как и ожидалось:

 70397:     find library=lib1.so [0]; searching
 70397:      search path=/home/me/software/myproject/build/myproject-install/bin/tls/x86_64/x86_64:/home/me/software/myproject/build/myproject-install/bin/tls/x86_64:/home/me/software/myproject/build/myproject-install/bin/tls/x86_64:/home/me/software/myproject/build/myproject-install/bin/tls:/home/me/software/myproject/build/myproject-install/bin/x86_64/x86_64:/home/me/software/myproject/build/myproject-install/bin/x86_64:/home/me/software/myproject/build/myproject-install/bin/x86_64:/home/me/software/myproject/build/myproject-install/bin          (RUNPATH from file ./myproject-install/bin/testExecutable)
 70397:       trying file=/home/me/software/myproject/build/myproject-install/bin/tls/x86_64/x86_64/lib1.so
 70397:       trying file=/home/me/software/myproject/build/myproject-install/bin/tls/x86_64/lib1.so
 70397:       trying file=/home/me/software/myproject/build/myproject-install/bin/tls/x86_64/lib1.so
 70397:       trying file=/home/me/software/myproject/build/myproject-install/bin/tls/lib1.so
 70397:       trying file=/home/me/software/myproject/build/myproject-install/bin/x86_64/x86_64/lib1.so
 70397:       trying file=/home/me/software/myproject/build/myproject-install/bin/x86_64/lib1.so
 70397:       trying file=/home/me/software/myproject/build/myproject-install/bin/x86_64/lib1.so
 70397:       trying file=/home/me/software/myproject/build/myproject-install/bin/lib1.so

Но для второй зависимости указанный RPATH даже не ищется.

 70397:     find library=lib2.so [0]; searching
 70397:      search cache=/etc/ld.so.cache
 70397:      search path=/lib/x86_64-linux-gnu/tls/x86_64/x86_64:/lib/x86_64-linux-gnu/tls/x86_64:/lib/x86_64-linux-gnu/tls/x86_64:/lib/x86_64-linux-gnu/tls:/lib/x86_64-linux-gnu/x86_64/x86_64:/lib/x86_64-linux-gnu/x86_64:/lib/x86_64-linux-gnu/x86_64:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu/tls/x86_64/x86_64:/usr/lib/x86_64-linux-gnu/tls/x86_64:/usr/lib/x86_64-linux-gnu/tls/x86_64:/usr/lib/x86_64-linux-gnu/tls:/usr/lib/x86_64-linux-gnu/x86_64/x86_64:/usr/lib/x86_64-linux-gnu/x86_64:/usr/lib/x86_64-linux-gnu/x86_64:/usr/lib/x86_64-linux-gnu:/lib/tls/x86_64/x86_64:/lib/tls/x86_64:/lib/tls/x86_64:/lib/tls:/lib/x86_64/x86_64:/lib/x86_64:/lib/x86_64:/lib:/usr/lib/tls/x86_64/x86_64:/usr/lib/tls/x86_64:/usr/lib/tls/x86_64:/usr/lib/tls:/usr/lib/x86_64/x86_64:/usr/lib/x86_64:/usr/lib/x86_64:/usr/lib             (system search path)
 70397:       trying file=/lib/x86_64-linux-gnu/tls/x86_64/x86_64/lib2.so
 70397:       trying file=/lib/x86_64-linux-gnu/tls/x86_64/lib2.so
 70397:       trying file=/lib/x86_64-linux-gnu/tls/x86_64/lib2.so
 70397:       trying file=/lib/x86_64-linux-gnu/tls/lib2.so
 70397:       trying file=/lib/x86_64-linux-gnu/x86_64/x86_64/lib2.so
 70397:       trying file=/lib/x86_64-linux-gnu/x86_64/lib2.so
 70397:       trying file=/lib/x86_64-linux-gnu/x86_64/lib2.so
 70397:       trying file=/lib/x86_64-linux-gnu/lib2.so
 70397:       trying file=/usr/lib/x86_64-linux-gnu/tls/x86_64/x86_64/lib2.so
 70397:       trying file=/usr/lib/x86_64-linux-gnu/tls/x86_64/lib2.so
 70397:       trying file=/usr/lib/x86_64-linux-gnu/tls/x86_64/lib2.so
 70397:       trying file=/usr/lib/x86_64-linux-gnu/tls/lib2.so
 70397:       trying file=/usr/lib/x86_64-linux-gnu/x86_64/x86_64/lib2.so
 70397:       trying file=/usr/lib/x86_64-linux-gnu/x86_64/lib2.so
 70397:       trying file=/usr/lib/x86_64-linux-gnu/x86_64/lib2.so
 70397:       trying file=/usr/lib/x86_64-linux-gnu/lib2.so
 70397:       trying file=/lib/tls/x86_64/x86_64/lib2.so
 70397:       trying file=/lib/tls/x86_64/lib2.so
 70397:       trying file=/lib/tls/x86_64/lib2.so
 70397:       trying file=/lib/tls/lib2.so
 70397:       trying file=/lib/x86_64/x86_64/lib2.so
 70397:       trying file=/lib/x86_64/lib2.so
 70397:       trying file=/lib/x86_64/lib2.so
 70397:       trying file=/lib/lib2.so
 70397:       trying file=/usr/lib/tls/x86_64/x86_64/lib2.so
 70397:       trying file=/usr/lib/tls/x86_64/lib2.so
 70397:       trying file=/usr/lib/tls/x86_64/lib2.so
 70397:       trying file=/usr/lib/tls/lib2.so
 70397:       trying file=/usr/lib/x86_64/x86_64/lib2.so
 70397:       trying file=/usr/lib/x86_64/lib2.so
 70397:       trying file=/usr/lib/x86_64/lib2.so
 70397:       trying file=/usr/lib/lib2.so

Я думаю, что ключ в том, что поиск lib1 сообщает (RUNPATH from file ./myproject-install/bin/testExecutable), тогда как поиск lib2 сообщает (system search path)

Я не понимаю, почему RPATH отличается для 2 библиотек, когда для TARGET было установлено свойство RPATH, которое не изменяется.

Сбой библиотеки происходит из ExternalProject, который был связан. Другой создается в этом скрипте cmake.

1 Ответ

0 голосов
/ 10 ноября 2018

Решением было установить RPATH как для lib1.so, так и для lib2.so. Я думаю, что проблема могла заключаться в том, что lib1 также зависит от lib2, поэтому поиск был инициирован не testExecutable, а lib1, зависимостью testExecutable.

...