Учитывая общую библиотеку, которую я создаю с помощью 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)
используя разные переменные, у меня кружилась голова. Как мне это сделать?
Каталоги вывода для разных артефактов сборки регулируются разными CMake переменные (и соответствующими свойствами):
.dll
- CMAKE_RUNTIME_OUTPUT_DIRECTORY.lib
- CMAKE_ARCHIVE_OUTPUT_DIRECTORY.pdb
- CMAKE_COMPILE_PDB_OUTPUT_DIRECTORYПример:
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)
Заметьте, что у меня это почти работает. Я изменил CMAKE_BINARY_DIR в файле CMakeLists.txt верхнего уровня. Таким образом, я обнаружил, что CMAKE_BINARY_DIR изменяется в зависимости от того, какой файл CMakeLists.txt вызывается. Поэтому мне пришлось использовать это:
Нет, никогда не устанавливайте переменную CMAKE_BINARY_DIR
: CMake предполагает, что она указывает на верхний каталог сборки, и некоторые функции могут внезапно выйти из строя, если это не так.
Хорошо, спасибо за совет, я постараюсь изменить это.
Я обнаружил, что это работает:
# 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}
)
Должны ли эти команды установки поступать до или после вызова
add_library
? Похоже, он ДОЛЖЕН быть установлен раньше, чтобы работать.