简单的方法以递归方式获取到导入目标的INTERFACE_LINK_LIBRARIES的所有路径?

时间:2019-07-18 16:41:50

标签: cmake

我正在尝试制作一个函数addLibrary,该函数可以使用任何类型的库,并将在该函数上调用target_link_libraries,然后找到该库的路径并将该库复制到发行文件夹中。我当前正在使用find_library查找该库的路径。除我在导入的目标(例如addLibrary)上调用addLibrary(Qt5::Widgets)之外,此方法都很好。这将失败,因为find_library不适用于导入的目标。我希望有一个if情况,用于检查传递的库是否为导入的目标。如果是这样,则必须递归地找到每个目标的INTERFACE_LINK_LIBRARIES,找到所述目标的位置,然后将该文件复制到我的发布文件夹中。我发现了一种使用INTERFACE_LINK_LIBRARIESIMPORTED_LOCATION的方法,但这很复杂。

您是否知道一种简单的方法来递归地解析具有特定导入目标的链接接口并获取每个文件的路径?

在我的用例中,我想调用addLibrary(Qt5::Widgets)并将libQt5Widgets.so,libQt5Gui.so和libQt5Core.so添加到我的发布文件夹中。

1 个答案:

答案 0 :(得分:0)

好吧,我没有找到简单的方法,但是我找到了一种方法:

macro(getAllLinkedLibraries iTarget iReturnValue)
   if(NOT TARGET ${iTarget})
        message(WARNING "${iTarget} is not a target")
    else()
        get_target_property(path ${iTarget} LOCATION)
        if(NOT ${path} IN_LIST ${iReturnValue})
            list(APPEND ${iReturnValue} ${path})
        endif()
        get_target_property(linkedLibrairies ${iTarget} INTERFACE_LINK_LIBRARIES)
        if(NOT "${linkedLibrairies}" STREQUAL "")
            FOREACH(linkedLibrary ${linkedLibrairies})
                getAllLinkedLibraries(${linkedLibrary} ${iReturnValue})
            ENDFOREACH()
        endif()
    endif()
endmacro()

用法:

find_package(Qt5Widgets REQUIRED)
getAllLinkedLibraries("Qt5::Widgets" someList)
message(STATUS "List = ${someList}")

输出:

-- List = /home/user/Documents/work/project/build/venv/.conan/data/Qt/5.11.3/org/dev/package/80043e232e8ab07f4b25e67652a9490d9ad33d91/lib/libQt5Widgets.so.5.11.3;/home/user/Documents/work/project/build/venv/.conan/data/Qt/5.11.3/org/dev/package/80043e232e8ab07f4b25e67652a9490d9ad33d91/lib/libQt5Gui.so.5.11.3;/home/user/Documents/work/project/build/venv/.conan/data/Qt/5.11.3/org/dev/package/80043e232e8ab07f4b25e67652a9490d9ad33d91/lib/libQt5Core.so.5.11.3

此函数将递归地查找到给定导入目​​标的所有链接接口,并将它们的路径添加到包括目标的列表中。