74 lines
1.8 KiB
Markdown
74 lines
1.8 KiB
Markdown
---
|
|
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
|