2014-07-24 3 views
0

Я хочу, чтобы связать различные библиотеки для режима Debug/Release, в CMakeLists.txt, я попытался это первый:CMake установить синтаксис команды для статических библиотек

set(basic_lib 
    debug 
     ws2_32 cryptlibd 
    optimized 
     ws2_32 cryptlib 
) 

Это не работает, он всегда ищет ws2_32 + cryptlibd, даже в режиме Release, что вызывает ошибку связывания. Снова я попробовал:

set(basic_lib 
    optimized <---------- put optimized first 
     ws2_32 cryptlib 
    debug 
     ws2_32 cryptlibd 
) 

теперь она всегда ссылается на ws2_32 + cryptlib, как в режиме/Debug Release.

Похоже, что cmake ссылается на определенную библиотеку.

Тогда я попытался простой:

set(basic_lib 
    debug 
     cryptlibd 
    optimized 
     cryptlib 
) 

только один Lib связать, на этот раз все прекрасно работает, почему?

ответ

2

Посмотрите на документацию для target_link_libraries, в частности, в синтаксисе команды:

target_link_libraries(<target> [item1 [item2 [...]]] 
         [[debug|optimized|general] <item>] ...) 

Обратите внимание, как для каждого элемента вам необходимо указать debug/optimized/general отдельно. Это просто то, как команда работает.

Для более мелкозернистого контроля вы можете использовать generator expressions для установки таких вещей.

set(basic_libs 
    $<$<CONFIG:Debug>:ws2_32d.lib cryptlibd.lib> 
    $<$<NOT:$<CONFIG:Debug>>:ws2_32.lib cryptlib.lib>) 
target_link_libraries(foo ${basic_libs}) 

Примечание хотя, что семантика несколько отличается здесь: Вы получите d библиотеки только для конфигурации Debug, в то время как указания debug для target_link_libraries относится ко всем конфигурациям, перечисленных в DEBUG_CONFIGURATIONS.

+0

Я не думаю, что замечание о DEBUG_CONFIGURATIONS истинно. Однако целевые свойства MAP_IMPORTED_CONFIG_ * потребляются. – steveire

+0

@steveire _ Отладочное ключевое слово соответствует конфигурации отладки (или конфигурациям, названным в глобальном свойстве DEBUG_CONFIGURATIONS, если оно установлено) _ Из документов «target_link_libraries», указанных выше. Обратите внимание, что по умолчанию 'DEBUG_CONFIGURATIONS' пуст, и вы должны установить его перед первым вызовом' target_link_libraries', чтобы иметь какой-либо эффект. В целом, это довольно хрупкий механизм по сравнению с генераторными выражениями. – ComicSansMS

+0

А, я перевернул смысл вашего комментария, извините :). Я думал, вы подразумеваете, что «DEBUG_CONFIGURATIONS» применяется к выражениям генератора. – steveire

Смежные вопросы