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感谢您为我指出了类似的问题。我想这不是一个简单的方法,但我在这篇文章中添加了一个答案,其中有一个函数就是这样做的。