2016-03-03 3 views
0

Итак, я столкнулся с довольно большой головной болью, создающей мое программное обеспечение с помощью CMake.CMake: библиотеки переопределения, добавленные target_link_libraries

Я создаю стороннюю библиотеку статически (dlib), для которой требуются zlib и libpng (как статические, так и встроенные) библиотеки для поддержки PNG-функций. CMakeFile предоставляется библиотекой COTS dlib делает основной:

target_link_libraries(dlib ${dlib_required_libs}) 

Это делает все его библиотеку, сконфигурированной как «общей» библиотека, которые в конечном итоге используется как для выпуска и отладки строит.

Это не проблема в Linux, но Windows имеет прекрасную «функцию» для указания библиотеки времени выполнения (/ MT или/MD или/MTd или/MDd). Любые несоответствия между этими флагами вызывают множественные ошибки определения символа во время соединения. Т.е. если libpng был построен с/MT и мое программное обеспечение использует/MTd, они будут несовместимы.

Чтобы облегчить это, у меня есть две встроенные версии zlib и libpng. Один набор, использующий флаг/MT для релизов, и другой/MTd для сборки Debug. Они счастливо соединяются в моем собственном программном обеспечении, используя оптимизированные/debug флаги в target_link_libraries, где они используются. HOWEVER, dlib (сторонняя сторона) связывает только набор выпусков zlib и libpng libs, так как он написан CMakeFile.

Мой главный вопрос: есть ли способ «переопределить» то, что dlib связывает, не изменяя его предоставленный CMakeFile? Я попытался переписать dlib_LIB_DEPENDS и выгнать его в кеш из отчаяния, но безрезультатно.

+2

Согласно [dlib/CMakeLists.txt] (https://github.com/davisking/dlib/blob/master/dlib/CMakeLists.txt), библиотека 'PNG' выполняется с помощью' find_package' и 'zlib 'компилируется из источников с самим проектом' dlib'. Таким образом, связь с 'zlib' не является проблемой: скомпилированный' zlib' принимает те же определения компиляции, что и 'dlib', не так ли? – Tsyvarev

+0

К сожалению, libpng зависит от zlib, поэтому для компиляции libpng необходим предварительный скомпилированный zlib. – mascoj

+0

Ну, собственно, позвольте мне исправить это. Соответствующая библиотека zlib (с/MT или/MTd) была необходима для * link * с соответствующим libpng. – mascoj

ответ

2

FindPNG.cmake сценарий, как и многие другие Find*.cmake скрипты, используемые find_package(), не заботятся о создании мультиконфигурации. Так что он просто искал одну библиотеку, в то время как многоконфигурные сборки естественно хотят library-per-config.

Для поиска библиотеки PNG, предназначенной для каждой конфигурации, можно написать собственный скрипт FindPNG.cmake (и установить CMAKE_MODULE_PATH, чтобы указать на каталог с этим скриптом).

Но для конкретного использования проще просто переписать вывод оригинального сценария, который устанавливается PNG_LIBRARY переменная кэша указывает на библиотечно-за конфигурации:

оптимизирован PNG-Lib-релиз отлаживать PNG Пб-отлаживать

или, используя выражение генератора,

$ < $ < CONFIG: Release>: PNG Пб-релиз> $ < $ < CONFIG: Debug>: PNG Пб-отлаживать> `

(вместо PNG -lib-release и png-lib-debug должны быть пути к версии выпуска и отладки библиотеки соответственно).

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

+0

Спасибо, что написали ответ, на всякий случай, когда кто-то сталкивается с этой проблемой. – mascoj

0

Dlib поставляется с копиями libpng и zlib в dlib/external. По умолчанию CMakeLists.txt от dlib будет строить их правильно и статически связывать их с вашей программой. Поэтому решение должно позволить этому сделать это. Не пытайтесь создать отдельную статическую библиотеку, потому что, как вы заметили, это вызывает много проблем в окнах.

+0

Забыл упомянуть, что я использую более старую версию dlib, которая не поставляется с libpng и zlib без опции для обновления. Хороший ответ, хотя – mascoj

+0

Прошло не менее двух лет с тех пор, как dlib включил libpng и zlib в дистрибутив. Почему бы не использовать более новую версию? –

+0

Потому что это не под моим контролем, и (несколько) программ, использующих его, намного старше этого. – mascoj

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