LabVIEW портал

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

Создание DLL и вызов в LabVIEW

1. Для начала скачиваем и инсталлируем Qt

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

2. Открываем Qt и создаём новый пустой проект

CreateProject

 

EmptyProject

 

ProjectName

 

И нажимаем ОК, ОК. Теперь у нас есть пустой Qt проект.

3. Открываем файл .pro и вписываем туда три строки:

QT -= core gui
TARGET = Test
TEMPLATE = lib

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

 

4. Теперь в проект добавляем файл .cpp, в котором будет находится исходный код нашей библиотеки.

DobavitjFajl

 

AddSourceFile

 

SourceFileName

 

И нажимаем пару раз на ОК.

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.

 

DLLOutputDebug

 

7. Открывем LabVIEW и стартуем пустой VI. В блок диаграмме выбираем CLFN (code library function node).

 

AddCLFN

 

8. Два раза на него кликаем и в настройках указываем наш DLL. В списке функций находим две наши экспортированные функции.

 

FuncName

 

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

 

FuncAdd

 

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

 

Parameters

 

Обратите внимание на Function Prototype, он должен выглядеть примерно так же, как мы указывали в коде нашей библиотеки. Названия параметров не очень важны, а вот порядок и типы должны обязательно совпадать.

 

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

 

SystemError

 

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

 

DLLRunning

 

Комментарии  

 
+2 #1 Андрей Дмитриев 26.11.2010 18:38
Спасибо!

Если будет время, то было бы здорово выяснить вот что:

1. Можно ли скомпилировать StandAlone библиотеку (ну то есть чтобы внешние "RunTime" DLL были вообще не нужны)? Какой размер получится при этом?

2. Можно ли скомпилировать кроссплатформен ную библиотеку? Ну то есть чтобы одним махом под Win, Linux и Mac, при этом ещё чтобы в SubVI ничего перелинковывать не требовалось (я так полагаю, что если в CLFN указать имя без расширения или Test* или Test.* без пути вообще, то оно должно сработать)

3. Можно ли сделать библиотеку, содержащую в себе GUI? Как на отреагирует LabVIEW на вызов GUI из CLFN?

Ну есть ещё пара любопытных моментов - насколько производительны й код генерится и можно ли подключить к Qt внешний компилятор?

Андрей.
Цитировать
 
 
0 #2 Евгений Граф 26.11.2010 18:57
1. да, это 100% возможно, нужна статическая линковка. На счёт размера, думаю что во-первых нужно делать релиз, а не дибаг версию, размер при этом уменьшается раз в десять. Ну а при статической линковке думаю просто нужно сложить размеры всех библиотек в один.
2. не думаю, при различных осях и архитектурах нужно будет перекомпилирова ть библиотеку. Ну а для вызова в VI можно ничего не менять IMHO.
3. честно сказать не пробовал. Мне как то не нужно было. Да и зачем мне какие то GUI в окнах, не принадлежащих LabVIEW, Я бы в этом случае сделал какой нибудь .NET класс или ActiveX элемент.
4. внешний компилятор должен подключаться без особых проблем, а о производительно сти данного компилятора ничего сказать не могу, по моему это gcc или g++. Я сам пока не совсем разобрался что делает gcc, а что делает mingw32 в винде.

Кстати Qt SDK так же отлично работает в линуксе, я проверял.
Цитировать
 
 
0 #3 Алексей Феоктистов 28.11.2010 07:00
Вот такой вараинт нашел
Build Specification --> New --> Shared Library (DLL)
А возможно ли, создать динамическую библиотеку в LabVIEW, чтобы вызывать ее из других языков, при этом не устанавливая RunTime?
Цитировать
 
 
0 #4 Евгений Граф 28.11.2010 12:43
Без рантайма насколько я знаю нельзя.
Цитировать
 
 
0 #5 Алексей 14.06.2012 16:28
проблема в том что при вызове библиотеки из QT он на версию компилятора ругается
Цитировать
 

Добавить комментарий


Защитный код
Обновить