вторник, 25 октября 2011 г.

Самостоятельная сборка Gmsh. Windows

Несмотря на то, что на сайте Gmsh'а можно найти исполняемые файлы, подходящие практически для любой операционной системы (Windows, Linux, Mac OS X), иногда требуется собрать его из исходников. Например, вы обладаете экзотической платформой, для которой Gmsh не имеет готовой сборки. Или вы хотите почувствовать всю мощь Gmsh-библиотеки, включив функции API в свой код. В этих случаях вам придется собрать Gmsh самому из исходных файлов. Скачать исходники, также как и исполняемые файлы, можно с сайта, причем и в том и в другом случае у вас есть возможность выбора версии, которую вы хотите иметь. По старой доброй привычке рекомендую скачивать исходники версии Gmsh 2.4.2, поскольку очередные попытки использования более современных версий (2.5.0 и 2.5.1) оказались для некоторых тестов неудачными. В то время как Gmsh 2.4.2, наш старый трудяга, все перелопатил на ура. В пользу новых версий Gmsh'а - новые опции и поддержка более современных форматов файлов. Однако для меня надежность важнее. Поэтому мы снова работаем с версией 2.4.2.

Построение исполняемых файлов и библиотек Gmsh'а мы будем рассматривать на тех платформах, к которым я имею доступ (вы уж извините), а именно Windows XP и Windows Server 2003, Ubuntu 10.04 Lucid Lynx (с графикой) и Linux Suse (без графики). Поскольку для сборки программы под Windows и под Unix-подобными платформами зачастую требуются различные телодвижения, сегодня мы остановимся на рассмотрении только Windows систем.
Конечная цель, которую мы перед собой поставим, - собрать исполняемый файл gmsh.exe, библиотеку gmsh.lib, а также запустить простейшую программу, использующую Gmsh API (иначе - как потрогать библиотеку?).
Как и многие OpenSource программы Gmsh предназначен в первую очередь для работы под Unix-системами. Поэтому при сборке в Windows используются те же средства и та же последовательность действий, что приняты в Unix - конфигурирование Makefile, компиляция и сборка (make), установка полученных исполняемых файлов и библиотек в соответствующие директории (make install). Правда, последний шаг при работе в Windows не столь очевиден, однако давайте обо всем по порядку.
Начиная с версии 2.4.1 Gmsh для конфигурирования перешел на платформо-независимую систему построения build-файлов (makefiles в Unix, projects/workspaces в Windows MS Visual Studio) CMake. При этом, для корректной работы необходима версия CMake не ниже 2.6.
Итак, скачайте исходники Gmsh'а необходимой версии. Сделать это можно отсюда. Папку, в которую вы разархивируете Gmsh, назовем 'GmshSrc', чтобы не привязываться к конкретной версии (вы можете не следовать моим советам и скачать версию свежее, чем 2.4.2). Прежде, чем идти дальше, необходимо отметить, что для сборки Gmsh'а, необходимо иметь еще некоторое количество дополнительных библиотек. Если вы не хотите собирать их из исходников, разработчики Gmsh'а предлагают скачать готовые Windows-сборки всех нужных библиотек с заголовочными файлами одним архивом. Вот ссылка. Папка, которую вы в итоге будете иметь, называется 'gmsh-dep'. Для удобства поместите ее в папку 'GmshSrc'.
Если же вы хотите собирать все нужные библиотеки самостоятельно (как вы уже, наверное, догадались, это тоже OpenSource проекты, предназначенные в первую очередь для Unix-систем), смотрите следующую запись в этом блоге, посвященную сборке Gmsh под Unix. Однако я никогда не пробовал этим заниматься (в смысле - собирать эти библиотеки под Windows), поэтому будем рассматривать вариант с готовой папкой 'gmsh-dep'.
Итак, допустим, вы скачали CMake версии 2.8.5 для 32-битной ОС Windows (вот ссылка, по которой вы можете скачать архив cmake-2.8.5-win32-x86.zip). Далее распакуйте архив в папку cmake-2.8.5-win32-x86. Среди исполняемых файлов, лежащих в cmake-2.8.5-win32-x86\bin\ есть cmake.exe, cmake-gui.exe и другие. cmake-gui.exe - это программа, которая имеет графический интерфейс, cmake.exe - нет. И поскольку мы работаем в Windows, предлагаю запустить cmake-gui.exe. Вы увидите следующее окно:

Нажимаем кнопку 'Browse Source..' и выбираем нашу папку с исходниками 'GmshSrc'. Затем нажимаем 'Browse Build..' и выбираем пустую папку 'GmshBuild', в которую CMake сохранит файлы проекта. Как-то так:

Теперь нажимаем кнопку 'Add Entry' и добавляем информацию о папке с программами, от которых зависит Gmsh, т.е. путь к папке 'gmsh-dep':
Name: CMAKE_PREFIX_PATH
Type: PATH
Value: D:/GmshSrc/gmsh-dep
Description: /*оставляем пустым*/

Нажимаем 'OK'. Переменная CMAKE_PREFIX_PATH добавлена. Далее нажимаем кнопку 'Configure'. Вам будет предложено выбрать компилятор, который вы хотите использовать. У меня установлена MS Visual Studio 2008, поэтому я выбираю 'Visual Studio 9 2008', и оставляю значение радио-кнопки в положении по умолчанию 'Use default native compilers':

Нажимаем 'Finish'. CMake собирает всю необходимую информацию для построения файлов проекта. Например, проверяет работоспособность C- и C++-компиляторов, ищет различные файлы и т.д. Возможно, на данном этапе вы получите неожиданные ошибки. Помнится, как-то раз CMake, например, требовал компилятор Фортрана. Если возникнут какие-то проблемы, пишите - будем разбираться. Если же все прошло гладко, CMake выдаст примерно следующее:

Gmsh has been configured for Windows with the following options: Ann Chaco DIntegration FlTree Fltk FltkJpeg FltkPng FltkZlib Gmm MathEx Med Metis NativeFileChooser Netgen NoSocklenT OpenGL RefBlas RefLapack Tetgen

C compiler: cl
C++ compiler: cl
Build type: RelWithDebInfo
Install prefix: C:/Program Files/gmsh

Run 'ccmake D:/GmshSrc' to fine-tune the configuration.

Configuring done

Что здесь можно отметить. В первой строке перечислены все опции Gmsh, с которыми он будет собран. Это значения по умолчанию, которые хранятся в файле 'CMakeLists.txt' в папке 'GmshSrc'. Чтобы изменить их, можно запустить программу 'ccmake.exe' из той же папки, что и 'cmake-gui.exe', и передать ей в качестве параметра путь до 'GmshSrc' (собственно, это CMake и предлагает сделать, говоря "Run 'ccmake D:/GmshSrc' to fine-tune the configuration"). Все то же самое можно сделать и из окна 'cmake-gui.exe', который в данный момент открыт перед вами:

Чтобы развернуть все опции, какие только возможны, нажмите галочку 'Advanced' (я обвел ее красным прямоугольником). Все то же самое можно сделать и из 'ccmake.exe'. Для изменения значения опции, ставьте/убирайте галочки, а строковые переменные просто вбивайте руками.
Есть еще один способ изменения опций. Это редактирование файла 'CMakeLists.txt' из папки 'GmshSrc' для изменения параметров по умолчанию (для загрузки измененной версии этого файла необходимо почистить кэш, в котором хранятся текущие значения параметров (для этого можно в программе 'cmake-gui.exe' нажать 'File->Delete Cache' или просто удалить файл 'CMakeCache.txt' из папки 'GmshBuild' и запустить 'cmake-gui.exe' заново)) или редактирование уже названного файла 'CMakeCache.txt', в котором хранятся текущие настройки опций (после изменения этого файла нужно перезагрузить кэш, нажав 'File->Reload Cache'). Однако, поскольку мы работаем в Windows, грех не воспользоваться графическими приложениями. И в этом смысле 'cmake-gui.exe' подходит лучше всего.
Примечание! Обратите внимание на параметр 'CMAKE_INSTALL_PREFIX'. Он содержит путь к папке, куда будут установлены исполняемый файл, библиотеки и заголовочные файлы Gmsh'а. В данном случае он указывает на папку 'C:/Program Files/gmsh'. Мы обязательно вспомним этот путь, когда будем писать код с использованием Gmsh API.
Если вас устраивают настройки опций, нажмите на 'Configure' еще раз. Теперь становится доступной кнопка 'Generate'. Нажимаем, и если все нормально, Cmake выдаст долгожданную фразу "Generating done". После этого CMake можно закрывать и запускать файл проекта, который лежит в папке 'GmshBuild'.
Всего имеется 11 проектов:
ALL_BUILD, clean_doc, gmsh, html, info, INSTALL, lib, PACKAGE, shared, txt, ZERO_CHECK
При запуске любого из этих проектов, откроется gmsh solution, содержащее все 11 проектов. Поэтому можно просто запустить файл 'gmsh.sln', находящийся в той же папке.
Чтобы собрать исполняемый файл 'gmsh.exe', статическую библиотеку 'gmsh.lib' или динамически подключаемую библиотеку 'gmsh.dll', во-первых, выбираем тип сборки, например, 'RelWithDebInfo', а также платформу (у меня по умолчанию Win32, но вдруг у вас 64-битная):

Затем нажимаем правой кнопкой мыши на соответствующем проекте в Solution Explorer (для 'exe' - gmsh, 'lib' - lib, 'dll' - shared) и выбираем 'Build':

Вуаля. Ждем довольно долго (хотя многое зависит от вашего компьютера), а затем лезем в папку, соответствующую типу сборки. В нашем случае - в папку 'GmshBuild/RelWithDebInfo'. Там находятся файлы 'gmsh.exe', 'Gmsh.lib' и 'Gmsh.dll'.
Если вам нужно было просто собрать библиотеку, то на этом шаге можно остановиться. Однако для эффективного использования Gmsh API в своем коде, соберите проект под названием 'INSTALL' тем же способом. В результате сборки все готовые к тому моменту исполняемые файлы, библиотеки и заголовочные файлы Gmsh'а попадут в папку 'C:\Program Files\gmsh', которая задавалась на этапе конфигурирования через переменную 'CMAKE_INSTALL_PATH'. Сборка проекта 'INSTALL' аналогична действию 'make install' в Unix'е, кто понимает о чем речь.

Ну и в заключение попробуем использовать библиотеку Gmsh'а в своем коде. К сожалению, до сих нет документации по использованию функций и классов Gmsh'а. Однако некоторые характерные средства использования Gmsh API показаны в примерах, которые находятся в папке 'GmshSrc/utils/api_demos'. Один из таких файлов мы и попробуем скомпилировать и запустить.
Для этого создаем пустой консольный С++ проект в MS Visual Studio. Затем добавляем в проект файл 'mainSimple.cpp' из указанной выше папки. Выбираем тип сборки Release (для сборки Debug работать не будет). Теперь добавляем библиотеку 'Gmsh.lib' в проект (для этого открываем свойства проекта и в разделе 'Linker->General' в поле 'Additional Library Directories' указываем путь до файла 'Gmsh.lib', а в разделе 'Linker->Input' в поле 'Additional Dependencies' пишем 'Gmsh.lib'), а также указываем путь к папке с заголовочными файлами Gmsh'а, которая формируется во время сборки проекта 'INSTALL' (для этого в свойствах проекта в разделе 'C/C++->General' в поле 'Additional Include Directories' указываем путь 'C:\Program Files\gmsh\include\gmsh'). И затем заветный 'Build' выдает нам долгожданный 'Build succeeded'. Так? Нет! Кроме библиотеки 'Gmsh.lib' потребуется некоторое количество дополнительных библиотек, которые можно подсмотреть в свойствах проекта, генерируемого CMake'ом. Опытным путем было получено, что необходимо включить такие библиотеки, как:
  1. fltk.lib
  2. fltkgl.lib
  3. fltkforms.lib
  4. fltkimages.lib
  5. fltkjpeg.lib
  6. fltkpng.lib
  7. fltkz.lib
  8. med.lib
  9. hdf5.lib
  10. blas.lib
  11. lapack.lib
  12. g2c.lib
  13. gcc.lib
  14. opengl32.lib
  15. glu32.lib
  16. wsock32.lib
  17. comctl32.lib
Первые 13 библиотек содержатся в папке 'gmsh-dep/lib'. Добавлять сами библиотеки и пути к ним нужно способом, описанным выше для 'Gmsh.lib'. Если на вашем компьютере нет оставшихся 4 библиотек - поищите их в интернете и киньте в папку 'gmsh-dep/lib', чтобы не прописывать новые пути в свойствах проекта. Попробуйте собрать проект еще раз. Теперь все должно работать.

Поддержка OpenCASCADE
Возник довольно интересный вопрос по поводу сборки Gmsh'а под Windows с поддержкой OpenCASCADE. О том, зачем нужен OpenCASCADE, я писал здесь и здесь. Несмотря на то, что в готовой сборке под Windows от авторов Gmsh'а поддержка OCCT есть, в папке в дополнительными библиотеками gmsh-dep, от которых зависит Gmsh, вы не найдете библиотеки OCCT. Это связано, скорее всего, с тем, что библиотека OCCT огромна. Поэтому, для того, чтобы самому собрать Gmsh с поддержкой OCCT, прежде всего необходимо установить библиотеки OpenCASCADE на компьютер. Для Windows существует установочный файл, который можно скачать с сайта opencascade.org и который распакует все необходимые библиотеки, заголовочные файлы, документацию, примеры и т.д. в указанное вами место. По хорошему, установщик должен также прописать необходимые пути в системную переменную CASROOT. Однако практика показывает, что это происходит не всегда. Для того, чтобы проверить, что эта переменная среды инициализирована, вбейте в командной строке

echo %CASROOT%

Если вы устанавливали OCCT по умолчанию, то CASROOT будет указывать в C:\OpenCASCADEx.x.x, где x.x.x - это версия библиотеки. Может случиться так, что переменная CASROOT вообще не инициализирована. Однако, ни в том, ни в другом случае CMake не найдет нужных библиотек, когда вы будете переконфигурировать Gmsh, и поддержка OpenCASCADE не подключится. Почему так произойдет? Потому что CMake будет искать их не там, где они лежат на самом деле. Чтобы убедиться в этом, можете посмотреть файл CMakeLists.txt, который лежит в корневой папке исходников Gmsh'а и которым руководствуется CMake для поиска зависимостей. Для того, чтобы Cmake все-таки нашел необходимые библиотеки, нужно изменить переменную CASROOT. Она должна иметь вид:

echo %CASROOT%
C:\OpenCASCADEx.x.x\ros\inc;C:\OpenCASCADEx.x.x\ros\winY\vcZ\lib

где Y = ( 32 | 64 ) зависит от платформы, Z = ( 8 | 9 | 10 ) зависит от версии Visual Studio. Перед конфигурированием Gmsh'а не забудьте поставить галочку напротив ENABLE_OCC, если она там не стоит. Если все пройдет успешно, то в списке опций, с которыми собран Gmsh, вы увидите строку OpenCascade. Если ее нет, то проверьте еще раз все пути и переменную CASROOT.

23 комментария:

  1. Mikhail, если интересно взгляни на мой FASTRAN. Это МКЭ-программа для расчета динамики тонкостенных оболочек. В целом состоит из препроцессора (только просмотр готовых МКЭ-моделей), решателя и постпроцессора (просмотр результатов расчетов). К сожалению полноценного собственного сеточного генератора создать не получилось (не хватило времени). Хотя мне было бы очень интересно продолжить эту работу, а главное найти полноценного собеседника по этому вопросу. Буду рад комментариям.

    ОтветитьУдалить
  2. 2.4.2 всё нормально скомпилилось и получилось всё что надо exe lib dll но почему то экзешник вылетает когда я хочу меш сделать а 2.5.0 не компилится там как раз похоже компилятор фортарана нужен не подскажешь что надо чделать

    ОтветитьУдалить
  3. По поводу того, что 2.4.2 вылетает: первое, что я бы попробовал - скачал готовый экзешник, и уже на нем попробовал сделать то же самое, на чем вылетает версия 2.4.2. Если будет вылетать и на готовом, собранном авторами, варианте, то скорее всего, это не проблема вашей сборки, а проблема модели, сетку которой вы хотите построить. В любом случае, можете выложить свою модель. Это поможет разобраться в проблеме.
    По поводу того, что 2.5.0 не компилится и требует компилятор фортрана: в файле CMakeLists.txt, который лежит в корневой папке архива gmsh-2.5.0-source и который содержит все инструкции для CMake по поиску зависимостей Gmsh'а, написано, что компилятор фортрана требуется только тогда, когда библиотеки Blas и Lapack не могут быть найдены стандартными средствами CMake. Под Windows CMake в первую очередь ищет Blas и Lapack из набора библиотек Intel MKL, и, если находит, то при конфигурировании это будет указано так: Blas(IntelMKL) Lapack(IntelMKL). Затем CMake проверяет Blas и Lapack в папке gmsh-dep, которую сделали авторы Gmsh'а. В этом случае при конфигурировании будет выведено: Blas(Ref) Lapack(Ref). Именно так произошло у меня, т.к. библиотек Intel MKL у меня нет. Поиск компилятора фортрана происходит только если CMake не нашел Blas и Lapack в предыдущих двух местах, а поскольку эти библиотеки точно лежат в gmsh-dep, я бы посоветовал проверить наличие gmsh-dep и прописанного к ней пути в CMake.

    ОтветитьУдалить
  4. готовая версия 2.4.2 рабоает отлично без сбоев а вылетает у меня на любом примере когда я делаю сам меш и у меня ксати при компиляции cmake получилось 7 проектов а не 11 может в этом дело.

    ОтветитьУдалить
  5. и ещё пи загрузке примера появляется ошибка: singular value decomposition requires LAPACK

    ОтветитьУдалить
  6. оо класс 2.5.0 скомпилилось и он не вылетает и работает отлично как и готовый 2.5.0 так что проблема с вылетом 2.4.2 уже не актуальна)

    ОтветитьУдалить
  7. Прекрасно. Но по поводу вылета 2.4.2 и ошибки "singular value decomposition requires LAPACK" - это отсутствие библиотек Blas и Lapack. Видимо на этапе конфигурирования CMake не подцепил их. Можете на всякий случай проверить мое предположение, посмотрев Help->About Gmsh->Build options. Там должны быть опции Blas и Lapack. Если нет, то именно поэтому ваша сетка и не строилась.

    ОтветитьУдалить
  8. да так и есть там нету их а в 2.5.0 есть) правильно ли я пнимаю что теперь в dll у нас есть всё что делает gmsh и можно её использовать

    ОтветитьУдалить
  9. мне бы теперь запустить gmsh из java не знаешь случаем как это сделать

    ОтветитьУдалить
  10. Увы. С java никогда не работал.

    ОтветитьУдалить
  11. ладно буду разбираться а тебе огромное спасибо за статью и за оперативные ответы а то бы мучился с этим не знаю сколько а так всё быстро получилось)))

    ОтветитьУдалить
  12. попытался я пример скомпилить и что то куча ошибок выдаётся по либам
    1>Gmsh.lib(drawContext.obj) : error LNK2001: unresolved external symbol __imp__glPixelStorei@8
    1>fltkgl.lib(gl_draw.obj) : error LNK2001: unresolved external symbol __imp__glPixelStorei@8
    и тп

    ОтветитьУдалить
  13. и у меня не собралсиь все заголовочные файлы в C:\Program Files\gmsh как мне тогда подключить все заголовочные файлы

    ОтветитьУдалить
  14. Приставки gl намекают на то, что это функции из библиотеки OpenGL. Проверьте, что у вас есть необходимые библиотеки, а также, что они сами и пути к ним прописаны в свойствах проекта. Подробнее смотрите в конце моей статьи.
    Если в результате сборки проекта INSTALL у вас нет заголовочных файлов в соответствующей папке (хотя это, конечно, странно), то можете создать необходимую папку, а затем скопировать туда все хедеры из поддиректорий GmshSrc, благо их не так уж и много.

    ОтветитьУдалить
  15. да все бибилиотеки есть и пути к ним добавил в свойствах проекта всё как написано в статье

    ОтветитьУдалить
  16. Вот выдержки из FAQ:
    2. Существуют ли дополнительные требования для запуска Gmsh'а?
    На вашей системе должны быть установлены и прописаны в path библиотеки OpenGL. Бесплатную замену OpenGL'ю можно найти на http://www.mesa3d.org.
    1. Gmsh жалуется на недостающие библиотеки.
    В Windows: если система жалуется на отсутствие библиотек "OPENGL32.DLL" или "GLU32.DLL", значит OpenGL был установлен на вашу машину неправильно. Вы можете скачать OpenGL с сайта Microsoft или напрямую с http://www.opengl.org.

    Это следует проверить.

    Другой вариант:
    При конфигурировании в CMake отключите поддержку пользовательского интерфейса (вы ведь все равно собираетесь пользоваться библиотекой). За это отвечают пункты ENABLE_FLTK, ENABLE_FL_TREE. Чтобы отключить их, просто убираете соответствующую галочку. После этого пересоберите проекты lib и INSTALL. У меня с этим вариантом пример mainSimple.cpp работает без включения библиотек opengl32.lib и glu32.lib.

    И САМОЕ ГЛАВНОЕ!!!
    Обязательно добавлю это в статью (как я мог забыть?!) - приведенный выше пример работает только для типа сборки Release. При абсолютно одинаковых настройках проекта Debug ничего не выдаст. По-моему, об этом даже на форуме Gmsh'а говорилось. Хотя, не помню точно.

    ОтветитьУдалить
  17. Ещё одн вопросик возник) Скомпилинный gmsh не хочет открывать brep файлы пишет что надо скомпилировать с пдержкой opencascadeю Что для этого надо сделать?

    ОтветитьУдалить
  18. 1. Нужно установить OpenCascade (opencascade.org, для Windows существуют готовые сборки)
    2. При конфигурировании Gmsh'а поставить галочку напротив ENABLE_OCC, если она там не стоит.
    3. Если CMake сразу не подцепит библиотеки OpenCascade, можно посмотреть, что при установке OCC создалась системная переменная CASROOT, в которой прописаны пути до библиотек OCC.

    ОтветитьУдалить
  19. opencascade поставил но cmake не подцепил библиотеки и я не могу найти CASROOT где она что надо сделать?

    ОтветитьУдалить
  20. в переменных среды этой переменной кстати нет

    ОтветитьУдалить
    Ответы
    1. Я дополнил статью, добавив раздел, посвященный поддержке OpenCascade.

      Удалить
  21. спасибо большое)) я уже разобрался сам в принципе но всё равно спасибо за ответ))

    ОтветитьУдалить