2015-06-03 2 views
1

Я хочу создать статическую и общую библиотеку, используя CMake для создания среды сборки. Кроме того, он должен создать ANSI и версию UNICODE.CMake создание общей и статической библиотеки с различными определениями

Я нашел объявление: Is it possible to get CMake to build both a static and shared version of the same library?

, который сказал мне, что я могу использовать несколько add_library заявления для достижения этой цели. Когда я это пробовал, он прекрасно создает библиотеки, но публикация не говорит мне, как устанавливать разные параметры -D в зависимости от того, какая версия построена.

Мои CMakeLists.txt в настоящее время выглядит следующим образом:

list(APPEND SUPPORT_SOURCE 
    dll_main.cpp 
) 

add_definitions(-DBUILD_SUPPORT_DLL) 

add_library(support SHARED ${SUPPORT_SOURCE}) 
add_library(support_s STATIC ${SUPPORT_SOURCE}) 
add_library(support_u SHARED ${SUPPORT_SOURCE}) 
add_library(support_su STATIC ${SUPPORT_SOURCE}) 

В конце концов, когда я строй DLL, функция нуждается в __declspec(dllexport) декларации, в которой она не должна иметь в статических версиях. Кроме того, чтобы построить вариант UNICODE, мне нужно пройти -DUNICODE.

Поэтому мне нужно знать, какая версия построена и использовать для нее соответствующие флаги сборки для различных целей.

Другое дело, что я не понимаю, как я могу создавать отладочные сборки с другим именем. Обычно я использую шаблон libname.lib и libname_d.lib, поэтому я могу иметь все возможные версии в одном каталоге для ссылки.

ответ

1

Вы можете установить флаги компилятора для каждой цели с помощью команды target_compile_definitions. Например:

target_compile_definitions(support PRIVATE MY_SHARED_DEFINITION) 
target_compile_definitions(support_s PRIVATE MY_STATIC_DEFINITION) 

Что касается добавления постфикса библиотек отладки, вы можете добиться этого, установив переменную CMake CMAKE_DEBUG_POSTFIX:

set(CMAKE_DEBUG_POSTFIX _d) 

Это приведет все неисполняемыми цели, чтобы _d приложили при построении в Debug. Если вам нужно больше детализированного контроль, вы можете установить DEBUG_POSTFIX свойства для отдельных целей:

set_target_properties(support support_s PROPERTIES DEBUG_POSTFIX -dbg) 

Это перекроет глобальное CMAKE_DEBUG_POSTFIX значения для этих двух целей и дать им -dbg суффикса вместо этого.