0

I'm building a dynamic library for other projects to use. To make it easier I'm creating the LibraryConfig.cmake file during the build process. I have successfully managed to get the consumer projects to include the headers of the project, but they fail to link against the library. What am I missing to get the consumer projects to properly link against my library?

Specifically the error looks like: ninja: error: 'My-Dynamic-Lib-NOTFOUND', needed by 'Consumer Project.so', missing and no known rule to make it

# Contents of My-Dynamic-LibConfig.cmake.in
if (NOT @PROJECT_NAME@_FOUND)
    set(@PROJECT_NAME@_LIBRARY_DIR "@LIBRARY_INSTALL_LIB_DIR@")
    set(PACKAGE_VERSION "@My-Dynamic-Lib_VERSION@")

    if (NOT EXISTS "@CMAKE_INSTALL_PREFIX@/include/my-dynamic/MyLib.hpp")
        MESSAGE(AUTHOR_WARNING "Failed to find the library header directory.")
    endif (NOT EXISTS "@CMAKE_INSTALL_PREFIX@/include/my-dynamic/MyLib.hpp")

    if (NOT WIN32)
        if (EXISTS "${@PROJECT_NAME@_LIBRARY_DIR}/libmy-dynamic.@DYN_LIB_EXT@")
            set(@PROJECT_NAME@_LIBRARIES "${@PROJECT_NAME@_LIBRARY_DIR}/libmy-dynamic.@DYN_LIB_EXT@")
        elseif (EXISTS "${@PROJECT_NAME@_LIBRARY_DIR}/libmy-dynamicd.@DYN_LIB_EXT@")
            set(@PROJECT_NAME@_LIBRARIES "${@PROJECT_NAME@_LIBRARY_DIR}/libmy-dynamicd.@DYN_LIB_EXT@")
        endif (EXISTS "${@PROJECT_NAME@_LIBRARY_DIR}/libmy-dynamic.@DYN_LIB_EXT@")
    else ()
        if (EXISTS "${@PROJECT_NAME@_LIBRARY_DIR}/my-dynamic.@STA_LIB_EXT@")
            set(@PROJECT_NAME@_LIBRARIES "${@PROJECT_NAME@_LIBRARY_DIR}/my-dynamic.@STA_LIB_EXT@")
        elseif (EXISTS "${@PROJECT_NAME@_LIBRARY_DIR}/my-dynamicd.@STA_LIB_EXT@")
            set(@PROJECT_NAME@_LIBRARIES "${@PROJECT_NAME@_LIBRARY_DIR}/my-dynamicd.@STA_LIB_EXT@")
        endif (EXISTS "${@PROJECT_NAME@_LIBRARY_DIR}/my-dynamic.@STA_LIB_EXT@")
    endif (NOT WIN32)

    add_library(@PROJECT_NAME@ SHARED IMPORTED ${@PROJECT_NAME@_LIBRARIES})
    set_target_properties(@PROJECT_NAME@ PROPERTIES
        INTERFACE_INCLUDE_DIRECTORIES "@CMAKE_INSTALL_PREFIX@/include"
        INTERFACE_LINK_LIBRARIES "${@PROJECT_NAME@_LIBRARIES}"
    )

    if (@PROJECT_NAME@_LIBRARIES)
        set(@PROJECT_NAME@_FOUND TRUE)
    else ()
        MESSAGE(AUTHOR_WARNING "Failed to find the library.")
        set(@PROJECT_NAME@_FOUND FALSE)
    endif (@PROJECT_NAME@_LIBRARIES)

    unset(@PROJECT_NAME@_LIBRARY_DIR)
endif (NOT @PROJECT_NAME@_FOUND)
JadziaMD
  • 2,690
  • 5
  • 31
  • 42
  • Hmm, you are not the first person who forgot to set *IMPORTED_LOCATION* for *IMPORTED* target. See [that question](https://stackoverflow.com/questions/50820408/cmake-imported-target-found-when-configuring-but-generated-build-make-says-targe) and my answer to it. – Tsyvarev Jun 17 '18 at 08:52
  • 1
    Possible duplicate of [CMake imported target found when configuring but generated build.make says target-NOTFOUND](https://stackoverflow.com/questions/50820408/cmake-imported-target-found-when-configuring-but-generated-build-make-says-targe) – JadziaMD Jun 20 '18 at 07:29

0 Answers0