cmake RPATH применяется только к первой зависимости
Я работал над компиляцией исполняемого файла, который имеет 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 ответ
Решением было установить RPATH для lib1.so и lib2.so. Я думаю, что проблема, возможно, заключалась в том, что lib1 также зависит от lib2, поэтому поиск был инициирован не testExecutable, а lib1, зависимостью testExecutable.