# import so with full path

**URL:** https://discourse.cmake.org/t/import-so-with-full-path/9796
**Category:** Usage
**Tags:** os:linux
**Created:** [January 8, 2024, 12:05pm UTC](https://discourse.cmake.org/t/import-so-with-full-path/9796 "2024-01-08T12:05:33Z")
**Posts on this page:** 3
**Page:** 1

<div class="post-metadata">

### Author: ![mvandenabeele](https://discourse.cmake.org/letter_avatar_proxy/v4/letter/m/848f3c/32.png) [@mvandenabeele](https://discourse.cmake.org/u/mvandenabeele)
#### Post date: [January 8, 2024, 12:05pm UTC](https://discourse.cmake.org/t/import-so-with-full-path/9796/1 "2024-01-08T12:05:33Z")

</div>

Hi

I’m trying to create a Find module for an SDK we’re using. What I currently have is this (can’t upload a file as new forum member):

```auto
find_package(PkgConfig)
pkg_check_modules(PC_Cerence QUIET Cerence)

find_path(Cerence_INCLUDE_DIR
  NAMES nds_common/ISystemManager.h
  PATHS ${CMAKE_SOURCE_DIR}/lib/csdk/inc
)

message("Cerence_INCLUDE_DIR = ${Cerence_INCLUDE_DIR}")

set( Cerence_LibDir_Suggestion ${CMAKE_SOURCE_DIR}/lib/csdk/lib)
message( "Cerence_LibDir_Suggestion = ${Cerence_LibDir_Suggestion}")

find_library(Cerence_dd_common_LIBRARY
  NAMES dd_common 
  PATHS ${Cerence_LibDir_Suggestion}
)
message("Cerence_dd_common_LIBRARY = ${Cerence_dd_common_LIBRARY}")

find_library(Cerence_dd_common_c_LIBRARY
  NAMES dd_common_c 
  PATHS ${Cerence_LibDir_Suggestion}
)
message("Cerence_dd_common_c_LIBRARY = ${Cerence_dd_common_c_LIBRARY}")

set(Cerence_VERSION ${PC_Cerence_VERSION})

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Cerence
  FOUND_VAR Cerence_FOUND
  REQUIRED_VARS
    Cerence_dd_common_LIBRARY
    Cerence_dd_common_c_LIBRARY
    Cerence_INCLUDE_DIR
  VERSION_VAR Cerence_VERSION
)

if(Cerence_FOUND)
  set(Cerence_LIBRARIES
    ${Cerence_dd_common_LIBRARY}
    ${Cerence_dd_common_c_LIBRARY}

    ${Cerence_LibDir_Suggestion}/libnds_audio.so 
    ${Cerence_LibDir_Suggestion}/libnds_audio_c.so 
    ${Cerence_LibDir_Suggestion}/libnds_audio_io_simulator.so 
    ${Cerence_LibDir_Suggestion}/libnds_audio_io_simulator_c.so 
    ${Cerence_LibDir_Suggestion}/libnds_audio_io_simulator_c.so 
    ${Cerence_LibDir_Suggestion}/libnds_audio_module_output.so 
    ${Cerence_LibDir_Suggestion}/libnds_audio_module_output_c.so 
    ${Cerence_LibDir_Suggestion}/libnds_audio_module_from_file.so 
    ${Cerence_LibDir_Suggestion}/libnds_audio_module_from_file_c.so 
    #nds_cloudservices 
    #nds_cloudservices_c 
    ${Cerence_LibDir_Suggestion}/libnds_prompter.so 
    ${Cerence_LibDir_Suggestion}/libnds_prompter_c.so 
    ${Cerence_LibDir_Suggestion}/libpal_core.so 
    ${Cerence_LibDir_Suggestion}/libve.so 
    #vocon_curl
  )

  set(Cerence_INCLUDE_DIRS ${Cerence_INCLUDE_DIR}/nds_prompter 
    ${Cerence_INCLUDE_DIR}/nds_audio 
    ${Cerence_INCLUDE_DIR}/nds_audio_module_output 
    ${Cerence_INCLUDE_DIR}/nds_audio_io_simulator 
    ${Cerence_INCLUDE_DIR}/nds_common 
    ${Cerence_INCLUDE_DIR}/nds_cloudservices 
    ${Cerence_INCLUDE_DIR}/pal )

  set(Cerence_DEFINITIONS ${PC_Cerence_CFLAGS_OTHER})
endif()

if(Cerence_FOUND AND NOT TARGET Cerence::Cerence)

  add_library(Cerence::Cerence SHARED IMPORTED GLOBAL)

  target_link_directories(Cerence::Cerence INTERFACE ${Cerence_LibDir_Suggestion})
  target_link_libraries(Cerence::Cerence INTERFACE "${Cerence_LIBRARIES}")
  set_target_properties(Cerence::Cerence PROPERTIES
    IMPORTED_LOCATION ${Cerence_dd_common_LIBRARY}
    IMPORTED_LOCATION ${Cerence_dd_common_c_LIBRARY}

    INTERFACE_COMPILE_OPTIONS "${PC_Cerence_CFLAGS_OTHER}"
    INTERFACE_INCLUDE_DIRECTORIES "${Cerence_INCLUDE_DIRS}"
  )
  install( DIRECTORY ${Cerence_LibDir_Suggestion}/ DESTINATION lib
    FILES_MATCHING PATTERN "*.so"
  )
    
endif()

mark_as_advanced(
  Cerence_INCLUDE_DIR
  Cerence_LIBRARY
)

```

The project that uses this Find module compiles and links perfectly, but for some reason, one so-file is linked using the full path, while other so’s are linked with only the filename. When I run the executable, only the library with full path is loaded. Why is this happening, and what can I do to make them all link using a full path? Please note, what I have now is puzzled together from various sources online and I do not have a very deep understanding of CMake yet. Still reading up on the subject…

Thanks in advance for any help!

Merijn

---

<div class="post-metadata">

### Author: ![ben.boeckel](https://discourse.cmake.org/letter_avatar_proxy/v4/letter/b/ea5d25/32.png) [@ben.boeckel](https://discourse.cmake.org/u/ben.boeckel)
#### Post date: [January 11, 2024, 1:43pm UTC](https://discourse.cmake.org/t/import-so-with-full-path/9796/2 "2024-01-11T13:43:44Z")

</div>

> [@mvandenabeele](#):
>
> ```auto
> set_target_properties(Cerence::Cerence PROPERTIES
> IMPORTED_LOCATION ${Cerence_dd_common_LIBRARY}
> IMPORTED_LOCATION ${Cerence_dd_common_c_LIBRARY}
> 
> INTERFACE_COMPILE_OPTIONS "${PC_Cerence_CFLAGS_OTHER}"
> INTERFACE_INCLUDE_DIRECTORIES "${Cerence_INCLUDE_DIRS}"
> )
> 
> ```

You’ve written `Cerence_dd_common_c_LIBRARY` to the `IMPORTED_LOCATION` by overwriting the first line. I would recommend making an imported target per library (with dependencies between them) and a `Cerence::Cerence` `INTERFACE` target that links both.

> [@mvandenabeele](#):
>
> ` add_library(Cerence::Cerence SHARED IMPORTED GLOBAL)`

I feel like letting the user decide `GLOBAL` or not is better than forcing it.

---

<div class="post-metadata">

### Author: ![mvandenabeele](https://discourse.cmake.org/letter_avatar_proxy/v4/letter/m/848f3c/32.png) [@mvandenabeele](https://discourse.cmake.org/u/mvandenabeele)
#### Post date: [January 11, 2024, 2:50pm UTC](https://discourse.cmake.org/t/import-so-with-full-path/9796/3 "2024-01-11T14:50:08Z")

</div>

Thanks for your reply. I’ll try and change my Find Module.
