Dies ist ein Artikel des Dart Adventskalenders 2019.
Dies ist ein Artikel über Darts Native Interface. Erfahren Sie, wie Sie die Sprachfunktionen Go und C mit Dart verwenden. Wir haben auch ein Docker-Image vorbereitet, damit Sie das Native Interface sofort ausprobieren können.
https://dart.dev/guides/libraries/c-interop
Mit dieser Funktion können Sie eine C-Sprachbibliothek verwenden. Die Sprache C ist jedoch nicht für die Bibliothek in der Sprache C geschlossen.
Systemsprachen wie Go und Rust können eine gemeinsam genutzte Bibliothek erstellen.
Über diese gemeinsam genutzte Bibliothek können Sie auch Funktionen wie Go und Rust in Dart verwenden.
Dart gehen immer noch die Bibliotheken aus. Daher ist es erforderlich, eine in C-Sprache entwickelte Bibliothek oder eine in Go entwickelte Bibliothek zu verwenden. Das native Interface macht Dart bequemer.
Wir haben einen Editor namens Code-Server hinzugefügt, der VSCode online ausführt. Daher können Sie die Entwicklung sofort starten, indem Sie Docker starten.
https://github.com/kyorohiro/my-code-server/tree/master/w/dart_and_go_and_c/
https://github.com/kyorohiro/advent-2019-code-server/tree/master/extra/dart_ffi_and_go_and_c
FROM ubuntu:20.04
WORKDIR /works
# install dart
RUN apt-get update
RUN apt-get install -y wget gnupg1
RUN apt-get install apt-transport-https
RUN sh -c 'wget -qO- https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -'
RUN sh -c 'wget -qO- https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > /etc/apt/sources.list.d/dart_stable.list'
RUN apt-get update
RUN apt-get -y install dart
# install go
RUN apt-get install software-properties-common -y
#RUN add-apt-repository ppa:longsleep/golang-backports
RUN apt-get update
RUN apt-get install golang-go -y
RUN apt-get install git -y
RUN go get github.com/ramya-rao-a/go-outline
RUN go get github.com/mdempsky/gocode
RUN go get github.com/uudashr/gopkgs/cmd/gopkgs
RUN go get github.com/sqs/goreturns
RUN go get github.com/rogpeppe/godef
# install c
RUN apt-get install musl-dev -y
# code-server
RUN wget https://github.com/cdr/code-server/releases/download/2.1692-vsc1.39.2/code-server2.1692-vsc1.39.2-linux-x86_64.tar.gz
RUN tar -xzf code-server2.1692-vsc1.39.2-linux-x86_64.tar.gz -C ./ --strip-components 1
RUN /works/code-server --install-extension Dart-Code.dart-code
RUN /works/code-server --install-extension ms-vscode.go
RUN /works/code-server --install-extension ms-vscode.cpptools
WORKDIR /app
ENV PATH=${PATH}:/lib/dart/bin
ENV PATH="${PATH}:/root/.pub-cache/bin"
RUN pub global activate webdev
RUN pub global activate stagehand
CMD ["/works/code-server", "--auth","none", "--host","0.0.0.0","--port","8443", "/app"]
docker-compose.yml
version: '3'
services:
app:
build: ./app
ports:
- "8080:8080"
- "8443:8443"
volumes:
- ./app:/app
# - /var/run/docker.sock:/var/run/docker.sock
command: /works/code-server --auth none --host 0.0.0.0 --port 8443 /app
Siehe insbesondere Github.
$ git clone https://github.com/kyorohiro/advent-2019-code-server.git
$ cd advent-2019-code-server/extra/dart_fmi_and_go_and_c
$ docker-compose build
$ docker-compose up -d
Öffnen Sie "http: //127.0.0.1: 8443 /" in Ihrem Browser
Gehen Sie zu VSCode-> Datei (Menü) -> / app / wgo
.
hello.go
package main
import "C"
import "fmt"
//export PrintHello
func PrintHello() {
fmt.Print("Hello,World")
}
func main() {}
Die PrintHello-Funktion von Go wird von Dart aufgerufen.
$ go build -o libhello.so -buildmode=c-shared hello.go
Dadurch werden die Dateien "libhello.h" und "libhello.so" erstellt. Laden wir es aus der C-Sprache, bevor wir es mit Dart laden.
main_hello.c
#include <stdio.h>
#include "libhello.h"
int main(int argc, char const *argv[])
{
PrintHello();
return 0;
}
Terminal
$ gcc -Wall -o main_hello.exe main_hello.c -L. -lhello
$ LD_LIBRARY_PATH=. ./main_hello.exe -L. -lhello
Hello,World
Ups !! Es hat gut funktioniert.
Gehen Sie zu VSCode-> Datei (Menü) -> / app / wdart
.
bin/main.dart
import 'dart:ffi' as ffi;
typedef PrintHello_func = ffi.Void Function();
typedef PrintHello = void Function();
void main(List<String> arguments) {
var path = "/app/wgo/libhello.so";
ffi.DynamicLibrary dylib = ffi.DynamicLibrary.open(path);
final PrintHello hello = dylib
.lookup<ffi.NativeFunction<PrintHello_func>>('PrintHello')
.asFunction();
hello();
}
Terminal
$ dart ./bin/main.dart
Hello,World
PS
Wir haben auch eine C-Sprachumgebung vorbereitet. Sie können es früher im Github-Repository sehen.
Mit Dart können Sie die in der Sprache Go entwickelten Funktionen voll ausnutzen. Von Dart aus kann ich also fast alles machen. Mit der Unterstützung von FMI ist es meiner Meinung nach einfacher, Native Interfaces zu schreiben.
Wenn es für die Serverseite ist, denke ich, dass Docker Image usw. für die Entwicklung bequem ist.
Über den Code-Server, der dieses Mal im folgenden Advent verwendet wurde Die Erklärung ist mehr als 20 Mal unterteilt. Wenn Sie interessiert sind, beziehen Sie sich bitte darauf.
https://qiita.com/advent-calendar/2019/code-server
Code
https://github.com/kyorohiro/my-code-server/tree/master/w/dart_and_go_and_c/
https://github.com/kyorohiro/advent-2019-code-server/tree/master/extra/dart_fmi_and_go_and_c