Подтвердить что ты не робот

Путь к целевому выходному файлу

У меня есть целевая библиотека .so, созданная add_library, и вам необходимо передать абсолютный путь к этой библиотеке во внешний script. Теперь у меня есть ${LIBRARY_OUTPUT_PATH}/${CMAKE_SHARED_LIBRARY_PREFIX}LangShared${CMAKE_SHARED_LIBRARY_SUFFIX} для этого (LIBRARY_OUTPUT_PATH определено в моем CMakeLists.txt). Это выглядит как жесткое кодирование для меня, потому что оно будет разорваться, как только цель будет переименована, или некоторые из ее свойств будут изменены. Есть ли способ получить абсолютный путь к выходу add_library?

4b9b3361

Ответ 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()