J'ai une cible de bibliothèque .so créée par add_library
Et j'ai besoin de passer un chemin absolu vers cette bibliothèque vers un script externe. Maintenant, j'ai ${LIBRARY_OUTPUT_PATH}/${CMAKE_SHARED_LIBRARY_PREFIX}LangShared${CMAKE_SHARED_LIBRARY_SUFFIX}
Pour cela (LIBRARY_OUTPUT_PATH
Est défini dans mon CMakeLists.txt
). Cela ressemble à un codage en dur pour moi, car il se cassera dès que la cible sera renommée ou que certaines de ses propriétés seront modifiées. Existe-t-il un moyen d'obtenir un chemin absolu vers la sortie de add_library
?
Vous devez utiliser un expression de générateur pour cela.
De la documentation pour add_custom_command
et les documents pour les expressions de générateur:
Les arguments de
COMMAND
peuvent utiliser des "expressions de générateur" ...Les expressions de générateur sont évaluées lors de la génération du système de génération pour produire des informations spécifiques à chaque configuration de génération.
Dans ce cas, en supposant que votre cible de bibliothèque s'appelle "MyLib", l'expression du générateur représentant le chemin d'accès complet à la bibliothèque construite serait:
$<TARGET_FILE:MyLib>
Essayer:
get_property(fancy_lib_location TARGET fancy_lib PROPERTY LOCATION)
message (STATUS "fancy_lib_location == ${fancy_lib_location}")
Où fancy_lib
Est la cible créée avec add_library (fancy_lib SHARED ...)
.
J'ai trouvé que cela fonctionne directement avec les générateurs Makefile, mais il y a plus de travail à faire pour les générateurs Visual Studio car la valeur de fancy_lib_location
N'est pas ce à quoi vous vous attendez:
fancy_lib_location
Contiendra une référence incorporée à une référence $(OutDir)
spécifique à Visual-Studio que vous devrez remplacer par la valeur de la variable CMake CMAKE_BUILD_TYPE
(Qui se résout en quelque chose comme Debug
, ou Release
).CMAKE_DEBUG_POSTFIX
, Alors elle ne sera pas être inclus dans la valeur (qui peut ou non être un bug, je ne sais pas).Pour développer la réponse de @bgooddr, voici une fonction CMake pour obtenir l'emplacement d'une cible:
function(get_fancy_lib_location)
set(options)
set(multiValueArgs LIB)
set(oneValueArgs LOCATION)
cmake_parse_arguments(get_fancy_lib_location "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
message (STATUS "fancy_lib == ${get_fancy_lib_location_LIB}")
get_property(fancy_lib_location TARGET "${get_fancy_lib_location_LIB}" PROPERTY LOCATION)
message (STATUS "fancy_lib_location == ${fancy_lib_location}")
set(${get_fancy_lib_location_LOCATION} ${fancy_lib_location})
endfunction()