Paranoid

Как скомпилировать плагин для Lightwave

инструкция для "чайников" от "чайника"

Преамбула

Эта статья является результатом моего тернистого пути освоения LightWave® SDK. Дело в том, что когда я последний раз чего-то программировал, компьютеры были в большинстве своём 8-ми битными, а редакторы исходного текста совмещены в одну оболочку с компилятором. Таким образом процесс создания работающей программы состоял из написания её (программы) текста и жамканья по волшебной кнопке «скомпилить весь этот шит». В сегодняшних реалиях, озадачившись идеей написания плагина на Си, я вполне ожидаемо столкнулся с некоторым количеством трудноразрешимых для меня проблем. А именно:

Тем, кто встречался с подобными проблемами и отступил перед ними я посвящаю эту статью. Изложенный в ней материал ни в коем случае не претендует на истину в последней инстанции. Более того, это всего лишь попытка дилетанта решить насущную проблему сколько-нибудь вменяемым способом. Так же здесь не рассматриваются вопросы эффективности разных компиляторов языка Си. Цель этой статьи всего лишь помочь читателю простейшим (на мой взгляд) путем скомпилировать свой исходный код на Си в работоспособный выполняемый код, представляющий из себя плагин (модуль расширения) для LightWave®. Также надо сказать что эта статья во многом является переводом статьи Mathians Wein “Compiling Lightwave-Plugins with Dev-C++ 5(beta)” с моими скромными дополнениями и обновлёнными скриншотами.


КОМПИЛЯТОР

Рассмотрев некоторое количество доступных для меня компиляторов, я остановил свой выбор на бесплатном GCC. Он более чем вполне может удовлетворить мои текущие амбиции как программиста. Также немаловажным фактором для меня явилось то, что данный компилятор имеет возможность создавать 64-битные динамические библиотеки, которыми по сути и являются плагины для LightWave®. В процессе выбора компилятора я сначала остановился на “Tiny C Compiler” из за его простоты, но выяснилось, что на тот момент он не имел возможности создавать 64-битные динамические библиотеки, что в свою очередь вынудило бы меня использовать для запуска собственных плагинов исключительно 32-битную версию LW. Всякие монструозные компиляторы от Intel и Microsoft вызывали у меня ощущение, что я собираюсь стрелять из пушки по воробьям. Кроме того количество настроек в них и изобилие всяких модулей, примочек и примочечек, финтифлюшек и прибамбасиков, смысл которых я порой не мог представить себе даже отдалённо, быстро отвернуло меня от этих, без сомнения достойных и мощных, продуктов.


ИСХОДНЫЙ КОД

Для написания и редактирования исходного кода я выбрал старинную, но поддерживаемую активистами и по сей день, среду разработки от BloodShed Software – Dev-C++.

Радость от такого выбора заключалась для меня прежде всего в том, что оказалось, существуют дистрибутивы компилятора gcc включающие в себя сразу и вышеуказанную среду разработки. Для моего неподготовленного сознания это означало, что мне не придется самостоятельно «прикручивать» компилятор к среде разработки. Напомню - я стремился найти кратчайший и простейший путь от написания исходного кода плагина до его запуска в LightWave®.

Адрес в интернете, по которому Вы сможете скачать этот дистрибутив будет приведен далее в этой статье.


КАК ПОДРУЖИТЬ DevC++, GCC И LIGHTWAVE® API

Итак, с компилятором и средой разработки я определился. Но остался еще один весьма важный вопрос – как заставить всё это сотрудничать с API LightWave®? В документации к LightWave® SDK есть глава, называющаяся “Compiling”. Информация, приведенная в ней, дала мне ответ на большую часть этого вопроса. Проблема состояла лишь в том, что в этой главе не было достаточно чётко (для моего уровня владения вопросом) описано как подготовить всё для компиляции именно 64-битных плагинов. Но так или иначе ответ на этот вопрос был найден. Большую помощь в этом мне оказала всё та же статья Mathians Wein “Compiling Lightwave-Plugins with Dev-C++ 5(beta)”. Так что если Вам будет что-то непонятно из моего изложения, то очень рекомендую обратиться к этой статье. Ниже я привожу последовательность действий, которую предлагаю произвести Вам для достижения заветной цели:

  1. Итак, скачиваем дистрибутив GCC с Dev-C++. На момент написания статьи последняя версия Dev-C++ была 5.11, а компилятора GCC 4.9.2. По этой же ссылке Вы сможете найти и более новые версии этих программ, если таковые будут появляться.
  2. Устанавливаем скачанный дистрибутив. Я установил его по пути “C:\Dev-Cpp” и в дальнейших разъяснениях я буду подразумевать, что он установлен именно туда.
  3. Теперь нам необходимо скомпилировать и собрать библиотеку из некоторых исходных файлов LightWave® SDK. Эта библиотека будет использоваться каждым плагином, который вы создадите. Она содержит некоторое количество кода и данные, необходимые для того, чтобы ваш плагин и LightWave® могли корректно взаимодействовать между собой.

Для этого запустите командную строку и наберите команду, прописывающую путь к Вашему Си компилятору. Это нужно для того, чтобы операционная система могла найти Ваш компилятор, когда Вы будете его запускать из командной строки. Выглядеть эта команда будет таким образом:

path=c:\Dev-Cpp\MinGW64\bin

Путь конечно может быть другим, если Вы установили дистрибутив не по тому же пути что и я.

Теперь, командой "CD", перейдите в директорию “source” LightWave® SDK . В моём случае это “C:\lwsdk2015.1\source” , а команда для перехода туда выглядит следующим образом:

cd c:\lwsdk2015.1\source

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

gcc -c -D_MSWIN -D_AMD64_ -O6 -I../include servmain.c servdesc.c username.c startup.c shutdown.c

Обратите внимание на параметр “-D_AMD64_” – его использование приводит к компиляции библиотеки для 64-битной версии LightWave®. Если Вы планируете создавать плагины для 32-битной версии, то вместо “-D_AMD64_” здесь следует использовать параметр “-D_X86_” (но сам я этого не проверял за ненадобностью).

Теперь вам нужно объединить полученные после компиляции объектные файлы в один файл библиотеки. Делается это следующей командой:

ar r libserver.a servdesc.o username.o startup.o shutdown.o

Теперь в директории “source” Lightwave® SDK Вы имеете несколько новых файлов. Нужные Вам называются servmain.o и libserver.a

  1. Следующим шагом мы создадим проект плагина в Dev-C++.

Запустите Dev-C++. Выберите пункт меню File->New->Project

В открывшемся окне выберите темплэйт и задайте имя Вашему проекту.

После нажатия кнопки “Ok” Вам будет предложено выбрать папку на диске, где будут располагаться файлы Вашего проекта. Я сделал у себя на диске C: папку “C_Projects” и уже внутри нее создаю подпапки для отдельных проектов. Итак, после выбора папки, в созданном вами проекте уже будут присутствовать два файла: dllmain.c и dll.h

Нам эти файлы не нужны, так как мы не планируем использовать функционал DllMain и кроме того мы вообще не планируем (как и рекомендует нам документация к SDK ) использовать платформо-зависимые API вызовы. Так что просто удалите эти файлы из Вашего проекта (используя значок с символом “-“ зеленого цвета на панели инструментов или через контекстное меню, появляющееся по щелчку правой кнопкой мыши на файле проекта). Вместо них добавьте в проект .c и .h файлы относящиеся к вашему плагину. (Я в экспериментальных целях добавил файл box.c, который можно найти в SDK среди примеров по этому пути: "sample\Modeler\CommandSequence\boxes\box1\box.c"). Затем перейдите в меню Project->Project Options… на закладку “Parameters”. Здесь нужно установить опции компилятора и линковщика для того чтобы у Вас получился именно плагин для LightWave® а не просто динамическая библиотека (DLL).

В зависимости от используемого Вами языка программирования (Си или Си++) в соответствующих полях должны быть следующие директивы:​

-DBUILDING_DLL=1

-D_MSWIN

-D_AMD64_

В окне директив линковщика следует добавить следующие директивы:

--no-export-all-symbols

--add-stdcall-alias

C:/lwsdk2015.1/source/servmain.o

C:/lwsdk2015.1/source/libserver.a

--def C:/lwsdk2015.1/source/serv.def

По поводу двух первых директив линковщика я ничего сказать не могу (и честно говоря не занимался выяснением на что они влияют, так что комментарии по этому вопросу особенно приветствуются =) ), но про оставшиеся три хочу предупредить, что они должны перечисляться именно в том порядке, в каком они приведены выше. Так же хочу заметить, что при добавлении servmain.o, libserver.a и serv.def посредством кнопки “Add library or object”, пути к этим файлам будут прописаны в относительном виде (т.е. относительно папки, в которой находится ваш проект). Таким образом, если Вы в дальнейшем переместите свой проект в другую папку, то линковщик уже не сможет найти servmain.o, libserver.a и serv.def. Поэтому настоятельно рекомендую вручную изменить эти пути на абсолютные, как это сделано у меня. Результат должен выглядеть так (конечно если вы использовали те же пути что и я):

Следующее, что Вам необходимо сделать, это указать компилятору где ему искать заголовочные файлы SDK. Для этого перейдите на закладку “Directories”, а в ней на раздел “Include Directories”. Кликните по иконке с изображением дерева папок и в открывшемся окне укажите на папку “Include” из SDK. После чего кликните на кнопку “Add”, чтобы добавить выбранную директорию к списку путей, по которым компилятор должен искать заголовочные файлы:

И, наконец, прейдите на закладку “Output” и отметив галкой пункт “Override output filename” измените расширение выходного файла вашего проекта с .dll на .p. В принципе, это не обязательно делать, так как LightWave® совершенно без разницы какое расширение имеет файл плагина, но по традиции все файлы плагинов для LightWave® имеют расширение .p.

Теперь, если всё сделано правильно, Вы можете нажать кнопку “Compile” на панели инструментов и создать исполняемый код Вашего плагина!

Не торопитесь закрывать Ваш проект - он пригодится нам на следующем шаге.


СОЗДАНИЕ ТЕМПЛЭЙТА ДЛЯ LIGHTWAVE ПЛАГИНОВ

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

Чтобы создать темплэйт войдите в меню “File->New->Project Template…”. Задайте какое-либо название для вашего темплэйта, например “Lightwave Plugin” (без кавычек конечно). Здесь же, в разделе “Icons:” Вы можете выбрать иконку, которую будет иметь Ваш тэмплэйт.

Теперь перейдите на вкладку “Files” и отключите галки напротив всех файлов, которые могут присутствовать в этом списке, иначе они будут автоматически создаваться в каждом Вашем новом проекте.

Теперь перейдите на вкладку “Extras” и установите галку напротив пункта “Use project’s include directories”.

Далее кликните по кнопке “Create” – темплэйт готов!

Теперь, чтобы создать проект для Вашего нового плагина, просто выберите пункт меню “File->New->Project…” и вместо темплейта “DLL” выберите темплэйт, созданный Вами. Добавляйте в Ваш проект нужные исходные файлы и жмите “Compile”. Все необходимые настройки в проекте уже будут присутствовать.

Ну вот вроде и всё, что я имею сообщить по данному вопросу. Комментируйте, поправляйте если заметите неточности, добавляйте подробности и разъяснения если пожелаете.


N_A

По ссылке статья 2004 года. Сдк лавы с тех времен не сильно поменялся, но вариантов выбора среды разработки стало больше. Я бы рекомендовал одну из версий MS Visual Studio, благо сдк поставляется с родным для студии файлом lwsdk.sln, который сокращает число телодвижений для настройки среды. Ну и популярный у многих QtCreator тоже вполне реально использовать.

Paranoid

N_A, а можешь поподробней объяснить - как подсунуть lwsdk.sln этому MS Visual Studio?
Я вполне чётко и ясно представляю себе парадигму Си, но чувствую себя в полной растерянности когда начинаются вот эти танцы с параметрами компиляции, линковки, выбора битности т.д.

N_A

Качаешь с офсайта микрософт бесплатную express или community версию (можно найти от 2010 до 2015). долго устанавливаешь. Распаковываешь сдк в какую-нить папку, и открываешь этот lwsdk.sln файл двойным кликом, ну или запускаешь студию и выбираешь что-то типа "файл"-> "открыть проект или решение". Т.к. формат сделан аж для 2008 студии, то откроется окно конвертации, где надо просто согласится преобразовать в свежую версию. После преобразования можно выбрать активной 64-битную конфигурацию, и "построить решение". Вероятно вылезет куча предупреждений (о том что старые функции типа fopen не безопасны и типа расширение .dll ньютеки зачем-то меняют на .p) или даже несколько ошибок, но это решаемые мелочи. Большинство примеров скомпилируются, и готовые файлы плагинов буду лежать в соответствующих папках ( например C:\LightWave_2015.3\sdk\lwsdk2015.3\sample\Layout\AnimUV\amd64\Debug\animuv.p )
Я использую по привычке 2010 студию, но проверял и на VS 2013 community - все работает.