Flutter/LED 검사(Windows)

[Dart] dart:ffi g++ 정적 라이브러리가 포함됨 DLL 함수 호출

FDG 2023. 4. 17. 18:38

1. func.cpp : .a(정적 라이브러리) 만들기

extern "C" __declspec(dllexport) int _returnValue(int i);

int _returnValue(int i) {  
   return (i+1);
}

g++ -c func.cpp

ar rc libfunc.a func.o 

 

2. func2.cpp : 정적 라이브러리를 포함한 동적 라이브러리 만들기

#include <iostream>

extern "C" __declspec(dllexport) int _returnValue(int i);
extern "C" __declspec(dllexport) int _returnValue2(int i);

int _returnValue2(int i) {
    std::cout << "Value in DLL : " << i << std::endl;
   return _returnValue(i);
}

g++ -shared -static -static-libgcc -static-libstdc++ -o func2.dll func2.cpp -Wl,--output-def,func2.def,--out-implib,libfunc2.a -L. -lfunc

 

or

 

g++ -shared -static -o func2.dll func2.cpp -Wl,--output-def,func2.def,--out-implib,libfunc2.a -L. -lfunc

 

3. dart_ffi_test.dart : 실행 파일 만들고 테스트

import 'dart:ffi' as ffi;
import "package:ffi/ffi.dart" as ffi2;

void main() {
 
  final path = './func2.dll';

  final customFunc = ffi.DynamicLibrary.open(path);

final _returnValue2 = customFunc.lookupFunction<
          ffi.Int32 Function(ffi.Int32),
          int Function(int)>(
      '_returnValue2');

  print(_returnValue2(1004));

}

dart compile exe dart_ffi_test.dart

 

4. 실행 결과

Value in DLL : 1004
1005