# file(GET\_RUNTIME\_DEPENDENCIES ...) unable to resolve dependencies even if RUNPATH is set.

**URL:** <https://discourse.cmake.org/t/file-get-runtime-dependencies-unable-to-resolve-dependencies-even-if-runpath-is-set/11252>\
**Category:** Code\
**Tags:** os:linux\
**Created:** [July 15, 2024, 11:03am UTC](https://discourse.cmake.org/t/file-get-runtime-dependencies-unable-to-resolve-dependencies-even-if-runpath-is-set/11252 "2024-07-15T11:03:14Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![Gulasch](https://discourse.cmake.org/letter_avatar_proxy/v4/letter/g/b3f665/32.png) [@Gulasch](https://discourse.cmake.org/u/Gulasch)\
**Post date:** [July 15, 2024, 11:03am UTC](https://discourse.cmake.org/t/file-get-runtime-dependencies-unable-to-resolve-dependencies-even-if-runpath-is-set/11252/1 "2024-07-15T11:03:14Z")

</div>

I am trying to install runtime dependencies on linux by calling file(GET\_RUNTIME\_DEPENDENCIES …) on my build output. According to the documentation of GET\_RUNTIME\_DEPENDENCIES, it uses objdump to look at the binaries’ RPATH or RUNPATH and search all resulting paths for the NEEDED libraries.

However, even with the RUNPATH containing all necessary paths containing the required shared objects, cmake still gives me a bunch of unresolved dependencies.

Passing the same paths that are set in RUNPATH to the DIRECTORIES argument of file(GET\_RUNTIME\_DEPENDENCIES …) succeeds in resolving all dependencies but gives me a warning for every dependency that I am unable to silence/turn off.

Here is the output of `readelf -d libMylib_lin_x64d.so.1.0.0 | head -20`:

```auto
 Tag Type Name/Value
 0x0000000000000001 (NEEDED) Shared library: [liblog4cplus.so.9]
 0x0000000000000001 (NEEDED) Shared library: [libcryptopp.so.8.3]
 0x0000000000000001 (NEEDED) Shared library: [libdcmdata.so.18]
 0x0000000000000001 (NEEDED) Shared library: [libofstd.so.18]
 0x0000000000000001 (NEEDED) Shared library: [libxerces-c-3.2.so]
 0x0000000000000001 (NEEDED) Shared library: [libpthread.so.0]
 0x0000000000000001 (NEEDED) Shared library: [libstdc++.so.6]
 0x0000000000000001 (NEEDED) Shared library: [libgcc_s.so.1]
 0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
 0x000000000000000e (SONAME) Library soname: [libMylib_lin_x64d.so.1]
 0x000000000000001d (RUNPATH) Library runpath: [$ORIGIN:$ORIGIN/../lib:/home/gulasch/.conan2/p/b/cryptc8e13ae91e60f/p/lib:/home/gulasch/.conan2/p/b/log4c5df06e985f3a4/p/lib:/home/gulasch/.conan2/p/b/openc69d3d7db3b05a/p/lib:lib:/home/gulasch/.conan2/p/b/jaspe16a77cc27d1e4/p/lib:/home/gulasch/.conan2/p/b/opene862f5376d9366/p/lib:/home/gulasch/.conan2/p/b/imath0e51a887ff6ff/p/lib:/home/gulasch/.conan2/p/b/libti9f14735261ffd/p/lib:/home/gulasch/.conan2/p/b/libdea4b1ad00bdbd1/p/lib:/home/gulasch/.conan2/p/b/xz_ut1e858d36cea6d/p/lib:/home/gulasch/.conan2/p/b/libwe89f655e7182ab/p/lib:/home/gulasch/.conan2/p/b/quircb247a8c1bbf6d/p/lib:/home/gulasch/.conan2/p/b/sg_dc34b16dff6208b/p/lib:/home/gulasch/.conan2/p/b/xerce5f41203938bb6/p/lib:/home/gulasch/.conan2/p/b/qt696009b81d695/p/lib:/home/gulasch/.conan2/p/b/qt696009b81d695/p/bin/archdatadir/plugins/sqldrivers:/home/gulasch/.conan2/p/b/pcre20afe2d5ebf49c/p/lib:/home/gulasch/.conan2/p/b/doubl5d4c4d34d83a6/p/lib:/home/gulasch/.conan2/p/b/fontcfac338373bef7/p/lib:/home/gulasch/.conan2/p/b/freeta20d2c1e0c3e0/p/lib:/home/gulasch/.conan2/p/b/libpn402ee48efea0a/p/lib:/home/gulasch/.conan2/p/b/bzip2b31559afc869e/p/lib:/home/gulasch/.conan2/p/b/brotle2db4ab3cc1fd/p/lib:/home/gulasch/.conan2/p/b/expatb6e837219b758/p/lib:/home/gulasch/.conan2/p/b/util-b22aa04c21e8c/p/lib:/home/gulasch/.conan2/p/b/libjp26b7cedd82fcb/p/lib:/home/gulasch/.conan2/p/b/sqlit3f252b752839e/p/lib:/home/gulasch/.conan2/p/b/libmy582f77fd99038/p/lib:/home/gulasch/.conan2/p/b/opens0ee33e3382a6c/p/lib:/home/gulasch/.conan2/p/b/zlib6747250a5944a/p/lib:/home/gulasch/.conan2/p/b/lz45edd945259b6d/p/lib:/home/gulasch/.conan2/p/b/odbcba036906a7ae0/p/lib:/home/gulasch/.conan2/p/b/libto0d3eec5b51b1b/p/lib:/home/gulasch/.conan2/p/b/libic287f0d1508b00/p/lib:/home/gulasch/.conan2/p/b/zstdd5bad879821af/p/lib:]
 0x000000000000000c (INIT) 0x128000
 0x000000000000000d (FINI) 0x1f661c
 0x0000000000000019 (INIT_ARRAY) 0x24c928
 0x000000000000001b (INIT_ARRAYSZ) 80 (bytes)
 0x000000000000001a (FINI_ARRAY) 0x24c978
 0x000000000000001c (FINI_ARRAYSZ) 8 (bytes)

```

And here is the generated script I use to resolve dependencies on the build library:

```auto
set(_INPUT_LIBS /mnt/c/Users/Gulasch/source/repos/MyProject/out/build/WSL-GCC-Debug/lib/libMylib_lin_x64d.so.1.0.0)
set(_OUTPUT_PATH /mnt/c/Users/Gulasch/source/repos/MyProject/out/install/WSL-GCC-Debug/lib)

if(_INPUT_LIBS)
	set(_LIBS_SECTION LIBRARIES ${_INPUT_LIBS})
endif()

file(GET_RUNTIME_DEPENDENCIES
	${_LIBS_SECTION}
	RESOLVED_DEPENDENCIES_VAR _r_deps
    UNRESOLVED_DEPENDENCIES_VAR _u_deps
	PRE_EXCLUDE_REGEXES
      "libc\\.so\\..*"
      "libgcc_s\\.so\\..*"
      "libm\\.so\\..*"
      "libstdc\\+\\+\\.so\\..*"
    POST_EXCLUDE_REGEXES
      "^/lib.*"
      "^/usr/lib.*"
)

file(INSTALL 
	DESTINATION ${_OUTPUT_PATH}
	TYPE SHARED_LIBRARY 
	FOLLOW_SYMLINK_CHAIN
	FILES
		${_r_deps}
)

foreach(_file IN ITEMS ${_u_deps})
	message(WARNING "Unresolved dependencies for ${_INPUT_LIBS}: ${_file}")
endforeach()

```

And here is the output of running the script with `cmake -P <script>`:

```auto
CMake Warning at MylibCopyRuntimeDependencies_PostBuild_Debug.cmake:54 (message):
  Unresolved dependencies for
  /mnt/c/Users/Gulasch/source/repos/MyProject/out/build/WSL-GCC-Debug/lib/libMylib_lin_x64d.so.3.6.0:
  libcharset.so.1

/mnt/c/Users/Gulasch/source/repos/MyProject/out/build/WSL-GCC-Debug/lib/Mylib/MylibCopyRuntimeDependencies_PostBuild_Debug.cmake(54): message(WARNING Unresolved dependencies for ${_INPUT_LIBS}${_INPUT_EXES}: ${_file} )
CMake Warning at MylibCopyRuntimeDependencies_PostBuild_Debug.cmake:54 (message):
  Unresolved dependencies for
  /mnt/c/Users/Gulasch/source/repos/MyProject/out/build/WSL-GCC-Debug/lib/libMylib_lin_x64d.so.3.6.0:
  libiconv.so.2

/mnt/c/Users/Gulasch/source/repos/MyProject/out/build/WSL-GCC-Debug/lib/Mylib/MylibCopyRuntimeDependencies_PostBuild_Debug.cmake(54): message(WARNING Unresolved dependencies for ${_INPUT_LIBS}${_INPUT_EXES}: ${_file} )
CMake Warning at MylibCopyRuntimeDependencies_PostBuild_Debug.cmake:54 (message):
  Unresolved dependencies for
  /mnt/c/Users/Gulasch/source/repos/MyProject/out/build/WSL-GCC-Debug/lib/libMylib_lin_x64d.so.3.6.0:
  liboflog.so.18

/mnt/c/Users/Gulasch/source/repos/MyProject/out/build/WSL-GCC-Debug/lib/Mylib/MylibCopyRuntimeDependencies_PostBuild_Debug.cmake(54): message(WARNING Unresolved dependencies for ${_INPUT_LIBS}${_INPUT_EXES}: ${_file} )
CMake Warning at MylibCopyRuntimeDependencies_PostBuild_Debug.cmake:54 (message):
  Unresolved dependencies for
  /mnt/c/Users/Gulasch/source/repos/MyProject/out/build/WSL-GCC-Debug/lib/libMylib_lin_x64d.so.3.6.0:
  libofstd.so.18

```

I manually set the BUILD\_RPATH to contain all linked lib dirs and $ORIGN, but leaving the BUILD\_RPATH property empty results in a much slimmer RUNPATH line in the objdump/readelf, but the script output does not change.

Does GET\_RUNTIME\_DEPENDENCIES use some different heuristic here or am I calling something wrong? just to cover my bases, the paths in RUNPATH _do_ contain the required libs. for example an `ll /home/gulasch/.conan2/p/b/libic287f0d1508b00/p/lib` returns

```auto
total 1228
drwxr-xr-x 2 gulasch gulasch 4096 May 17 12:44 ./
drwxr-xr-x 6 gulasch gulasch 4096 May 17 12:44 ../
lrwxrwxrwx 1 gulasch gulasch 19 May 17 12:44 libcharset.so -> libcharset.so.1.0.0*
lrwxrwxrwx 1 gulasch gulasch 19 May 17 12:44 libcharset.so.1 -> libcharset.so.1.0.0*
-rwxr-xr-x 1 gulasch gulasch 29496 May 17 12:44 libcharset.so.1.0.0*
lrwxrwxrwx 1 gulasch gulasch 17 May 17 12:44 libiconv.so -> libiconv.so.2.6.1*
lrwxrwxrwx 1 gulasch gulasch 17 May 17 12:44 libiconv.so.2 -> libiconv.so.2.6.1*
-rwxr-xr-x 1 gulasch gulasch 1216144 May 17 12:44 libiconv.so.2.6.1*

```

so it contains both the reportedly missing libcharset.so.1 and libiconv.so.2.

This both happens with cmake 3.30 and cmake 3.26

---

<div class="post-metadata">

**Author:** ![Gulasch](https://discourse.cmake.org/letter_avatar_proxy/v4/letter/g/b3f665/32.png) [@Gulasch](https://discourse.cmake.org/u/Gulasch)\
**Post date:** [July 17, 2024, 11:16am UTC](https://discourse.cmake.org/t/file-get-runtime-dependencies-unable-to-resolve-dependencies-even-if-runpath-is-set/11252/2 "2024-07-17T11:16:08Z")

</div>

I learned the difference between RPATH and RUNPATH. I used gcc with -Wl,–disable-new-dtags to set the RPATH instead of RUNPATH, now the runtime dependencies are correctly resolved and GET\_RUNTIME\_DEPENDENCIES is able to find all correct shared objects.
