Использовать внешнюю DLL в сборке cmake - PullRequest
7 голосов
/ 18 апреля 2011

Я работаю над сценариями cmake для своего проекта и столкнулся с проблемой:

Мой проект использует стороннюю библиотеку (FreeImage), которая имеет собственную систему сборки на основе Makefile. Я могу просто собрать FreeImage, просто запустив «make» (я использую gnuwin32), который создаст FreeImage с использованием MinGW и выдаст:

FreeImage.lib
FreeImage.dll

Теперь моя проблема двоякая:

  1. Я хочу выполнить "make" из моего скрипта cmake.
  2. Я хочу создать ссылку на импортируемую библиотеку (FreeImage.lib), а также убедиться, что библиотека DLL скопирована в правильное место для запуска EXE.

Я знаю, как сделать ссылку на файл LIB, но остальное я потерял.

Структура папок выглядит следующим образом:

MyProject                     # main directory
MyProject/Libs/FreeImage      # FreeImage root directory
MyProject/Libs/FreeImage/Dist # This is where FreeImage outputs go (LIB and DLL)

Кстати: я работаю на Windows 7. Я планирую построить свой проект как с MSVC, так и с MinGW.

Спасибо!

EDIT: Я сейчас пытаюсь использовать ExternalProject_Add вот так:

ExternalProject_Add(
    FreeImage
    PREFIX ./Libs/FreeImage
    URL ./Libs/FreeImage
    BUILD_COMMAND make
)

Это дает мне часть пути, но не полностью работает ... он пытается настроить вещи для меня и пытается использовать nmake ... тьфу

1 Ответ

2 голосов
/ 18 апреля 2011

На мой взгляд, есть два варианта:

В случае, если вы поместили свои источники FreeImage в дерево исходных текстов ваших проектов, самым простым вариантом может быть использование команды execute_process () . Предполагая, что FreeImage находится в дереве исходных текстов ваших проектов в "3rdparty / FreeImage /", вы можете сделать что-то вроде

execute_process( COMMAND make WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/3rdParty/FreeImage )

При желании вы можете скопировать dll из 3rdParty / FreeImage / bin в ваш собственный каталог bin. И тогда вы можете написать FreeImageConfig.cmake для импорта библиотеки:

add_library (FreeImage IMPORTED) set_target_properties (FreeImage PROPERTIES IMPORTED_LOCATION $ {PROJECT_SOURCE_DIR} / 3rdParty / FreeImage / lib) ...

Другой вариант - использовать модуль ExternalProject . Вы также можете взглянуть на эту статью от Kitware для обзора этого модуля. По сути, вы указываете полную цепочку команд, необходимых для получения исходного кода, настройки сборки, сборки исходного кода и его установки. Все в вашем собственном CMakeLists.txt

...