add void repo files
This commit is contained in:
parent
80ef6e92c4
commit
11895a94c4
148 changed files with 15344 additions and 0 deletions
74
void/notes/multi-language-library.md
Normal file
74
void/notes/multi-language-library.md
Normal file
|
|
@ -0,0 +1,74 @@
|
|||
---
|
||||
tags: dev
|
||||
---
|
||||
|
||||
# Multi Language Library
|
||||
|
||||
To create a library that can be used in multiple languages, the language that
|
||||
is going to implement the library needs to support [[notes/ffi|FFI]] with the language
|
||||
that the library is written in.
|
||||
|
||||
With this in, we can use the following in our favor:
|
||||
|
||||
- It's impossible that every language support every other language.
|
||||
- For compatibility reasons, Almost every language supports C's [[notes/abi|ABI]] for their [[notes/ffi|FFI]].
|
||||
- Some compiled language has the avility to compile a C's _"dynamic library"_ (`.so` file in unix and `.dll` in windows).
|
||||
- The [[notes/ffi|FFI]] use a _"dynamic library"_ to work.
|
||||
|
||||
So, in conclusion: **we can use whatever language that supports compiling to C's ABI to build multi language libraries**
|
||||
|
||||
## List of language that compiles to C's ABI
|
||||
|
||||
### [[Go]]
|
||||
|
||||
To produce a shared library, you need to compile it with compile with: `go build -buildmode=c-shared`.
|
||||
|
||||
Note that the documentation says you need to specify with functions needs to be exported:
|
||||
|
||||
> Build the listed main package, plus all packages it imports, into a C shared
|
||||
> library. The only callable symbols will be those functions exported using a
|
||||
> cgo //export comment. Requires exactly one main package to be listed.
|
||||
|
||||
Example:
|
||||
|
||||
src/go/main.go:
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import "C"
|
||||
import "fmt"
|
||||
|
||||
//export helloLib
|
||||
func helloLib(x C.int) {
|
||||
fmt.Printf("Hello from Go! x=%d\n", x)
|
||||
}
|
||||
|
||||
func main() {}
|
||||
```
|
||||
|
||||
src/c/main.c:
|
||||
|
||||
```c
|
||||
void helloLib(int);
|
||||
|
||||
int main() {
|
||||
helloLib(12345);
|
||||
}
|
||||
```
|
||||
|
||||
Building and running:
|
||||
|
||||
```bash
|
||||
go build -buildmode=c-shared -o libmy.so ./src/go/
|
||||
gcc -o test src/c/main.c libmy.so
|
||||
./test
|
||||
Hello from Go! x=12345
|
||||
```
|
||||
|
||||
Sources:
|
||||
|
||||
- <https://stackoverflow.com/questions/75035609/can-go-executable-be-used-as-a-dynamic-library>
|
||||
- <https://pkg.go.dev/cmd/go#hdr-Build_modes>
|
||||
|
||||
## List of languages that has support for FFI with C
|
||||
Loading…
Add table
Add a link
Reference in a new issue