1. Для начала скачиваем и инсталлируем Qt
Кстати можно использовать и MS Visual Studio или ещё какой нибудь IDE, но Qt бесплатный и мой выбор пал именно на него.
2. Открываем Qt и создаём новый пустой проект



И нажимаем ОК, ОК. Теперь у нас есть пустой Qt проект.
3. Открываем файл .pro и вписываем туда три строки:
QT -= core guiTARGET = TestTEMPLATE = lib
При этом в первой строке мы сообщеам о том, что мы не будем использовать графический интерфейс. Во второй указываем имя DLL, а в третьей говорим о том что мы хотим сделать библиотеку, а не приложение.
4. Теперь в проект добавляем файл .cpp, в котором будет находится исходный код нашей библиотеки.



И нажимаем пару раз на ОК.
5. Собственно код функций
extern "C"
{
__declspec(dllexport) float Add(float a, float b)
{
return a+b;
}
__declspec(dllexport) float Subtract(float a, float b)
{
return a-b;
}
}
Мы создали две функции на экспорт, то есть это те функции, которые мы сможем вызвать из LabVIEW. Если нужны внутренние функции, которые должны быть невидимыми наружу, просто не прописываем __declspec(dllexport) перед названием функции.
6. Ну что, теперь осталось скомпилировать библиотеку, у меня например не выскочило ни одной ошибки при компиляции и я получил DLL на выходе в папке debug.
7. Открывем LabVIEW и стартуем пустой VI. В блок диаграмме выбираем CLFN (code library function node).
8. Два раза на него кликаем и в настройках указываем наш DLL. В списке функций находим две наши экспортированные функции.

9. Выбираем функцию "Add" и переходим в параметры. Первое, что мы делаем - это указываем тип возвращаемого функцией значения.

10. Теперь добавляем параметры функции a и b, ну те числа которые должны суммироваться.

Обратите внимание на Function Prototype, он должен выглядеть примерно так же, как мы указывали в коде нашей библиотеки. Названия параметров не очень важны, а вот порядок и типы должны обязательно совпадать.
11. Нажав на ОК мы к сожалению видим, что нехватает какой то DLL. Ну что же, это DLL для Qt, она нужна и имеется у нас на диске. Находим её в папке, где заинсталлирован Qt и копируем в папку, где находится наша библиотека. Нехватающая DLL это как бы Run Time для Qt, т.к. мы использовали не статическую, а динамическую сборку.

12. Теперь осталось подключить числа на вход и увидеть результат.






Комментарии
Если будет время, то было бы здорово выяснить вот что:
1. Можно ли скомпилировать StandAlone библиотеку (ну то есть чтобы внешние "RunTime" DLL были вообще не нужны)? Какой размер получится при этом?
2. Можно ли скомпилировать кроссплатформен ную библиотеку? Ну то есть чтобы одним махом под Win, Linux и Mac, при этом ещё чтобы в SubVI ничего перелинковывать не требовалось (я так полагаю, что если в CLFN указать имя без расширения или Test* или Test.* без пути вообще, то оно должно сработать)
3. Можно ли сделать библиотеку, содержащую в себе GUI? Как на отреагирует LabVIEW на вызов GUI из CLFN?
Ну есть ещё пара любопытных моментов - насколько производительны й код генерится и можно ли подключить к Qt внешний компилятор?
Андрей.
2. не думаю, при различных осях и архитектурах нужно будет перекомпилирова ть библиотеку. Ну а для вызова в VI можно ничего не менять IMHO.
3. честно сказать не пробовал. Мне как то не нужно было. Да и зачем мне какие то GUI в окнах, не принадлежащих LabVIEW, Я бы в этом случае сделал какой нибудь .NET класс или ActiveX элемент.
4. внешний компилятор должен подключаться без особых проблем, а о производительно сти данного компилятора ничего сказать не могу, по моему это gcc или g++. Я сам пока не совсем разобрался что делает gcc, а что делает mingw32 в винде.
Кстати Qt SDK так же отлично работает в линуксе, я проверял.
Build Specification --> New --> Shared Library (DLL)
А возможно ли, создать динамическую библиотеку в LabVIEW, чтобы вызывать ее из других языков, при этом не устанавливая RunTime?
RSS лента комментариев этой записи