Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Statically link shared library using go build

Tags:

c

go

I need to create a static library to run it in a docker container. When running my code with go run main.go it just runs smoothly. However, things get complicated when I try to build my code as a static program (re-compile all dynamic dependencies into a standalone lib, including shared libraries).

My app depends on a C shared library located in my /usr/local/lib/librandom_c.so, while my app source code is located in $GOPATH/src/github.com/<user>/myapp.

When I build the app without trying to statically link the shared library, it works without complaining:

go build -a -o hello .

...but then docker complains that the shared library does not exist (using from scratch).

So far I have tried many combinations to statically build my app:

go build -a -ldflags '-linkmode "external" -extldflags "-static"' -o hello .

gives an error:

cannot find -lrandom_c

How do I statically link my lib?

like image 303
Jona Rodrigues Avatar asked Dec 09 '25 09:12

Jona Rodrigues


1 Answers

CL 26492 shows that it might be as simple (possible for Go 1.14 Q1 2020, not confirmed yet) as to do:

go build -static

That would encapsulate the magic incantations of:

  • windows: -tags netgo -ldflags '-H=windowsgui -extldflags "-static"'
  • linux/bsd: -tags netgo -ldflags '-extldflags "-static"'
  • macos: -ldflags '-s -extldflags "-sectcreate __TEXT __info_plist Info.plist"'
  • android: -ldflags -s
like image 76
VonC Avatar answered Dec 11 '25 00:12

VonC



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!