Cmake 递归获取导入目标的接口链接库的所有路径的简单方法?

Cmake 递归获取导入目标的接口链接库的所有路径的简单方法?,cmake,Cmake,我正在尝试创建一个函数,addLibrary,它接受任何类型的库,并在其中调用target\u link\u libraries,然后找到该库的路径并将该库复制到发布文件夹中。我目前正在使用find_library查找该库的路径。除了在导入的目标上调用addLibrary时(例如addLibrary(Qt5::Widgets)),这一切都很好。这将失败,因为find_library对导入的目标不起作用。我想要一个if案例来检查传递的库是否是导入的目标。如果是这样,那么它必须递归地找到每个目标的接

我正在尝试创建一个函数,
addLibrary
,它接受任何类型的库,并在其中调用
target\u link\u libraries
,然后找到该库的路径并将该库复制到发布文件夹中。我目前正在使用
find_library
查找该库的路径。除了在导入的目标上调用
addLibrary
时(例如
addLibrary(Qt5::Widgets)
),这一切都很好。这将失败,因为
find_library
对导入的目标不起作用。我想要一个if案例来检查传递的库是否是导入的目标。如果是这样,那么它必须递归地找到每个目标的
接口链接库
,找到所述目标的位置,然后将该文件复制到我的发布文件夹中。我找到了一种使用
接口链接库
导入位置
的方法,但它相当复杂

您是否知道一种简单的方法,可以递归地解析具有特定导入目标的链接接口,并获取这些文件的路径


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

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

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

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

您不是第一个想要该列表的人,请参见该问题:。@Tsyvarev感谢您为我指出了类似的问题。我想这不是一个简单的方法,但我在这篇文章中添加了一个答案,其中有一个函数就是这样做的。