Общая библиотека CMake: как указать разные выходные каталоги для файлов DLL и LIB?

Фон

Учитывая общую библиотеку, которую я создаю с помощью CMake:

add_library(SharedLib SHARED sharedlib.cpp shared_exports.h)
target_include_directories(SharedLib PUBLIC ${PROJECT_SOURCE_DIR}/src/libshared)
include(GenerateExportHeader)
GENERATE_EXPORT_HEADER(SharedLib
    EXPORT_MACRO_NAME SHARED_EXPORTS
    EXPORT_FILE_NAME ${PROJECT_SOURCE_DIR}/src/libshared/shared_exports.h)

Создает 5 файлов:

SharedLib.dll SharedLib.exp SharedLib.ilk SharedLib.lib SharedLib.pdb

Что здорово. Все выходные файлы попадают в каталог, который я указываю в глобальном файле CMakeLists.txt.

Вопрос

Но я хотел бы отдельно указать, что DLL и соответствующий ей файл PDB находятся в моем главном каталоге сборки где-то еще. (Оставив файл .lib там, где он есть)

Я перепробовал столько комбинаций:

set(CMAKE_BINARY_DIR ${CMAKE_SOURCE_DIR}/bin)

используя разные переменные, у меня кружилась голова. Как мне это сделать?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
1 111
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Каталоги вывода для разных артефактов сборки регулируются разными CMake переменные (и соответствующими свойствами):

Пример:

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_COMPILE_PDB_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/pdb)

add_library(SharedLib SHARED sharedlib.cpp shared_exports.h)

Должны ли эти команды установки поступать до или после вызова add_library? Похоже, он ДОЛЖЕН быть установлен раньше, чтобы работать.

C Johnson 30.10.2018 23:22

Заметьте, что у меня это почти работает. Я изменил CMAKE_BINARY_DIR в файле CMakeLists.txt верхнего уровня. Таким образом, я обнаружил, что CMAKE_BINARY_DIR изменяется в зависимости от того, какой файл CMakeLists.txt вызывается. Поэтому мне пришлось использовать это:

C Johnson 30.10.2018 23:29

Нет, никогда не устанавливайте переменную CMAKE_BINARY_DIR: CMake предполагает, что она указывает на верхний каталог сборки, и некоторые функции могут внезапно выйти из строя, если это не так.

Tsyvarev 30.10.2018 23:33

Хорошо, спасибо за совет, я постараюсь изменить это.

C Johnson 30.10.2018 23:39

Я обнаружил, что это работает:

# Top level CMakeLists.txt file:

set(CMAKE_BINARY_DIR ${CMAKE_SOURCE_DIR}/bin)
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR})
set(LIBRARY_OUTPUT_PATH    ${CMAKE_BINARY_DIR}/lib)

И в моем файле src / libShared / CMakeLists.txt мне пришлось поставить команду set ПЕРЕД звонком на add_library

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${EXECUTABLE_OUTPUT_PATH})
add_library(SharedLib SHARED sharedlib.cpp shared_exports.h)

в противном случае, я нашел трудный способ, я мог бы установить свойство ПОСЛЕ вызова add_library следующим образом:

set_target_properties(SharedLib PROPERTIES
    RUNTIME_OUTPUT_DIRECTORY ${EXECUTABLE_OUTPUT_PATH}
)

Другие вопросы по теме