У меня есть целевая библиотека .so, созданная add_library
, и вам необходимо передать абсолютный путь к этой библиотеке во внешний script. Теперь у меня есть ${LIBRARY_OUTPUT_PATH}/${CMAKE_SHARED_LIBRARY_PREFIX}LangShared${CMAKE_SHARED_LIBRARY_SUFFIX}
для этого (LIBRARY_OUTPUT_PATH
определено в моем CMakeLists.txt
). Это выглядит как жесткое кодирование для меня, потому что оно будет разорваться, как только цель будет переименована, или некоторые из ее свойств будут изменены. Есть ли способ получить абсолютный путь к выходу add_library
?
Путь к целевому выходному файлу
Ответ 1
Для этого вы должны использовать выражение генератора.
Из документов для add_custom_command
и документов для выражений генератора
Аргументы
COMMAND
могут использовать "выражения генератора"...Выражения генератора вычисляются при создании системы сборки для получения информации, специфичной для каждой конфигурации сборки.
В этом случае, если ваш целевой объект библиотеки называется MyLib, выражение генератора, представляющее полный путь к встроенной библиотеке, будет выглядеть следующим образом:
$<TARGET_FILE:MyLib>
Ответ 2
Try:
get_property(fancy_lib_location TARGET fancy_lib PROPERTY LOCATION)
message (STATUS "fancy_lib_location == ${fancy_lib_location}")
Где fancy_lib
- цель, созданная с помощью add_library (fancy_lib SHARED ...)
.
Я обнаружил, что работает непосредственно с генераторами Makefile, но для генераторов Visual Studio еще предстоит сделать больше, поскольку значение fancy_lib_location
не то, что вы ожидаете:
-
fancy_lib_location
будет содержать встроенную ссылку на специфическую для Visual-Studio ссылку$(OutDir)
, которую вам нужно будет заменить значением переменнойCMAKE_BUILD_TYPE
CMake (которая разрешает что-то вродеDebug
илиRelease
). - По крайней мере, для CMake 2.8.1 и, по крайней мере, для целей Visual Studio, и если вы установили переменную
CMAKE_DEBUG_POSTFIX
, то она будет не включена в значение (которое может или не может быть ошибкой, я не знаю).
Ответ 3
Чтобы расширить ответ на @bgooddr, вот функция CMake, чтобы получить местоположение цели:
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()