#cmake
#cmake
Вопрос:
У меня есть цель, которая создает общую библиотеку, назовите ее A, и она зависит от другой общей библиотеки, назовите ее B.
У меня есть несколько целей, которые зависят от A, называйте их C, D и E.
Я хочу скопировать A и B рядом с тем местом, где каждый C, D и E лежат на диске.
Формально говоря, я хочу скопировать разделяемую библиотеку A и любую другую разделяемую библиотеку, от которой зависит A, в местоположения любой цели, которая зависит от A.
Как я могу добиться этого в cmake? возможно ли это вообще?
Ответ №1:
Предполагая, что у вас есть полный контроль над всеми CMakeLists.txt
файлами, создающими все 5 целевых объектов, вы можете установить местоположение.dll или файлы .so создаются для . Вы можете отдельно указать место установки, предполагая, что вы хотите указать это место после этапа установки.
Команды, ссылающиеся на цель, должны быть размещены после создания цели с помощью add_library
/ add_executable
.
set_target_properies(A PROPERTIES
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" # import libraries
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" # .so files
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" # .dll files/programs
)
# similar as above, but specifying the path relative to CMAKE_INSTALL_PREFIX
install(TARGETS A
ARCHIVE DESTINATION lib
LIBRARY DESTINATION bin
RUNTIME DESTINATION bin
)
В зависимости от ваших потребностей вам нужна только одна из команд, и для обеих можно было бы заменить target A
списком целей. Таким образом, вы могли бы избежать повторения команды (команд) 5 раз. Однако я рекомендую сделать это в CMakeLists.txt
файле, в котором вы создаете цель.
Несмотря на то, что выходные каталоги относятся к текущему каталогу в приведенном выше примере, мы обошли это, используя абсолютный путь к каталогу сборки ( CMAKE_BINARY_DIR
) как часть имени каталога.
Комментарии:
1. к сожалению, это не совсем ответ на мой вопрос. хотя это может быть хорошим обходным маневром.