Как собрать статически слинкованную (staticaly linked) программу на GO, использующую библиотеки Tcl/Tk ? Чтобы команда Unix "ldd" при проверке исполняемого файла программы не выдавала никаких ссылок на динамические библиотеки, а команда "file" сообщала о приложении как о "staticaly linked".
cборка приложений Go
Модератор: Olej
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
cборка приложений Go
Перенесен сюда вопрос из другого обсуждения:
- perseus
- Писатель
- Сообщения: 99
- Зарегистрирован: 11 май 2017, 18:01
- Откуда: Щёлково, Московская обл.
- Контактная информация:
Re: cборка приложений Go
Я нашел какой-то вариант ответа на этот вопрос в интернете: blog.ralch.com/tutorial/golang-sharing-libraries
но на практике мне его реализовать не удаётся - команда go install -buildmode=shared -linkshared std ругается, что флаг -buildmode не определён, чертовщина какая-то !
но на практике мне его реализовать не удаётся - команда go install -buildmode=shared -linkshared std ругается, что флаг -buildmode не определён, чертовщина какая-то !
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: cборка приложений Go
Начинать нужно с версии Golangperseus писал(а):Я нашел какой-то вариант ответа на этот вопрос в интернете: blog.ralch.com/tutorial/golang-sharing-libraries
но на практике мне его реализовать не удаётся - команда go install -buildmode=shared -linkshared std ругается, что флаг -buildmode не определён, чертовщина какая-то !
Код: Выделить всё
[olej@dell ~]$ go version
go version go1.5.4 linux/amd64
Код: Выделить всё
[olej@dell ~]$ go help install
usage: go install [build flags] [packages]
Install compiles and installs the packages named by the import paths,
along with their dependencies.
For more about the build flags, see 'go help build'.
For more about specifying packages, see 'go help packages'.
See also: go build, go get, go clean.
Код: Выделить всё
[olej@dell ~]$ go help build
usage: go build [-o output] [-i] [build flags] [packages]
Build compiles the packages named by the import paths,
along with their dependencies, but it does not install the results.
If the arguments to build are a list of .go files, build treats
them as a list of source files specifying a single package.
When compiling a single main package, build writes
the resulting executable to an output file named after
the first source file ('go build ed.go rx.go' writes 'ed' or 'ed.exe')
or the source code directory ('go build unix/sam' writes 'sam' or 'sam.exe').
The '.exe' suffix is added when writing a Windows executable.
When compiling multiple packages or a single non-main package,
build compiles the packages but discards the resulting object,
serving only as a check that the packages can be built.
The -o flag, only allowed when compiling a single package,
forces build to write the resulting executable or object
to the named output file, instead of the default behavior described
in the last two paragraphs.
The -i flag installs the packages that are dependencies of the target.
The build flags are shared by the build, clean, get, install, list, run,
and test commands:
-a
force rebuilding of packages that are already up-to-date.
-n
print the commands but do not run them.
-p n
the number of builds that can be run in parallel.
The default is the number of CPUs available, except
on darwin/arm which defaults to 1.
-race
enable data race detection.
Supported only on linux/amd64, freebsd/amd64, darwin/amd64 and windows/amd64.
-v
print the names of packages as they are compiled.
-work
print the name of the temporary work directory and
do not delete it when exiting.
-x
print the commands.
-asmflags 'flag list'
arguments to pass on each go tool asm invocation.
-buildmode mode
build mode to use. See 'go help buildmode' for more.
-compiler name
name of compiler to use, as in runtime.Compiler (gccgo or gc).
-gccgoflags 'arg list'
arguments to pass on each gccgo compiler/linker invocation.
-gcflags 'arg list'
arguments to pass on each go tool compile invocation.
-installsuffix suffix
a suffix to use in the name of the package installation directory,
in order to keep output separate from default builds.
If using the -race flag, the install suffix is automatically set to race
or, if set explicitly, has _race appended to it. Using a -buildmode
option that requires non-default compile flags has a similar effect.
-ldflags 'flag list'
arguments to pass on each go tool link invocation.
-linkshared
link against shared libraries previously created with
-buildmode=shared
-pkgdir dir
install and load all packages from dir instead of the usual locations.
For example, when building with a non-standard configuration,
use -pkgdir to keep generated packages in a separate location.
-tags 'tag list'
a list of build tags to consider satisfied during the build.
For more information about build tags, see the description of
build constraints in the documentation for the go/build package.
-toolexec 'cmd args'
a program to use to invoke toolchain programs like vet and asm.
For example, instead of running asm, the go command will run
'cmd args /path/to/asm <arguments for asm>'.
The list flags accept a space-separated list of strings. To embed spaces
in an element in the list, surround it with either single or double quotes.
For more about specifying packages, see 'go help packages'.
For more about where packages and binaries are installed,
run 'go help gopath'.
For more about calling between Go and C/C++, run 'go help c'.
Note: Build adheres to certain conventions such as those described
by 'go help gopath'. Not all projects can follow these conventions,
however. Installations that have their own conventions or that use
a separate software build system may choose to use lower-level
invocations such as 'go tool compile' and 'go tool link' to avoid
some of the overheads and design decisions of the build tool.
See also: go install, go get, go clean.
Код: Выделить всё
[olej@dell ~]$ go help buildmode
The 'go build' and 'go install' commands take a -buildmode argument which
indicates which kind of object file is to be built. Currently supported values
are:
-buildmode=archive
Build the listed non-main packages into .a files. Packages named
main are ignored.
-buildmode=c-archive
Build the listed main package, plus all packages it imports,
into a C archive file. The only callable symbols will be those
functions exported using a cgo //export comment. Requires
exactly one main package to be listed.
-buildmode=c-shared
Build the listed main packages, plus all packages that they
import, into C shared libraries. The only callable symbols will
be those functions exported using a cgo //export comment.
Non-main packages are ignored.
-buildmode=default
Listed main packages are built into executables and listed
non-main packages are built into .a files (the default
behavior).
-buildmode=shared
Combine all the listed non-main packages into a single shared
library that will be used when building with the -linkshared
option. Packages named main are ignored.
-buildmode=exe
Build the listed main packages and everything they import into
executables. Packages not named main are ignored.
Всё на месте
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: cборка приложений Go
Кроме того, под Linux вы можете собирать своё приложение GCC:Olej писал(а): Начинать нужно с версии Golang
Код: Выделить всё
[olej@dell ~]$ gccgo --version
gccgo (GCC) 5.3.1 20160406 (Red Hat 5.3.1-6)
Copyright (C) 2015 Free Software Foundation, Inc.
Это свободно распространяемое программное обеспечение. Условия копирования
приведены в исходных текстах. Без гарантии каких-либо качеств, включая
коммерческую ценность и применимость для каких-либо целей.
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: cборка приложений Go
Быстрый способ разрешить любую непонятную программную проблему - не объяснять на пальцах, а привести программный код, который вызывает ошибки.perseus писал(а):но на практике мне его реализовать не удаётся
А если этот код (проект) большой, то составить прототип, моделирующий проблему. Это, казалось бы, лишняя работа (писать код прототипа), но опыт показывает, что это сокращает затрачиваемое время в разы.
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: cборка приложений Go
Мне не совсем понятно намерение (цель) так сделать для работы в системе (UNIX-like), где используются разделяемые библиотеки поддержки сторонних языков программирования.perseus писал(а): Как собрать статически слинкованную (staticaly linked) программу на GO, использующую библиотеки Tcl/Tk ? Чтобы команда Unix "ldd" при проверке исполняемого файла программы не выдавала никаких ссылок на динамические библиотеки,
Так любят делать в Windows, но это дурной путь.
В чём смысл? (т.е. он может и есть ... но не так очевидно ).
- perseus
- Писатель
- Сообщения: 99
- Зарегистрирован: 11 май 2017, 18:01
- Откуда: Щёлково, Московская обл.
- Контактная информация:
Re: cборка приложений Go
Касательно намерений (цели) сделать статическую сборку, мне нужно это по работе,
нужна автономная программа которая будет выполняться на удаленном оборудовании с ограниченным доступом, куда нет возможности грузить разделяемые библиотеки поддержки сторонних языков программирования.
Касательно версии у меня выдаёт go version xgcc (Ubuntu 4.9.3-0ubuntu4) 4.9.3.linux/386
нужна автономная программа которая будет выполняться на удаленном оборудовании с ограниченным доступом, куда нет возможности грузить разделяемые библиотеки поддержки сторонних языков программирования.
Касательно версии у меня выдаёт go version xgcc (Ubuntu 4.9.3-0ubuntu4) 4.9.3.linux/386
- perseus
- Писатель
- Сообщения: 99
- Зарегистрирован: 11 май 2017, 18:01
- Откуда: Щёлково, Московская обл.
- Контактная информация:
Re: cборка приложений Go
В моей версии go при запросе go help build в списке флагов отсутствует флаг -buildmode,
видимо нужно попробовать с другой версией go поэксперементировать.
Спасибо за подсказку, о результатах эксперимента отпишусь сюда.
видимо нужно попробовать с другой версией go поэксперементировать.
Спасибо за подсказку, о результатах эксперимента отпишусь сюда.
- perseus
- Писатель
- Сообщения: 99
- Зарегистрирован: 11 май 2017, 18:01
- Откуда: Щёлково, Московская обл.
- Контактная информация:
Re: cборка приложений Go
Вот результаты эксперемента с другой версией go:
Как видно из приведеммой распечатки команд, система требует установить и использовать для выполнения команды
go install -buildmode=shared -linkshared std
компилятор gccgo-go, НО в нем не определён флаг -buildmode как я уже писал выше
Замкнутый круг получается
Надо подумать
Код: Выделить всё
maksim@maksim-MS-7519 /usr/lib/python3.4 $ go version
go version go1.7.1 linux/386
maksim@maksim-MS-7519 /usr/lib/python3.4 $ go help install
usage: go install [build flags] [packages]
Install compiles and installs the packages named by the import paths,
along with their dependencies.
For more about the build flags, see 'go help build'.
For more about specifying packages, see 'go help packages'.
See also: go build, go get, go clean.
Код: Выделить всё
maksim@maksim-MS-7519 /usr/lib/python3.4 $ go help build
usage: go build [-o output] [-i] [build flags] [packages]
Build compiles the packages named by the import paths,
along with their dependencies, but it does not install the results.
If the arguments to build are a list of .go files, build treats
them as a list of source files specifying a single package.
When compiling a single main package, build writes
the resulting executable to an output file named after
the first source file ('go build ed.go rx.go' writes 'ed' or 'ed.exe')
or the source code directory ('go build unix/sam' writes 'sam' or 'sam.exe').
The '.exe' suffix is added when writing a Windows executable.
When compiling multiple packages or a single non-main package,
build compiles the packages but discards the resulting object,
serving only as a check that the packages can be built.
When compiling packages, build ignores files that end in '_test.go'.
The -o flag, only allowed when compiling a single package,
forces build to write the resulting executable or object
to the named output file, instead of the default behavior described
in the last two paragraphs.
The -i flag installs the packages that are dependencies of the target.
The build flags are shared by the build, clean, get, install, list, run,
and test commands:
-a
force rebuilding of packages that are already up-to-date.
-n
print the commands but do not run them.
-p n
the number of programs, such as build commands or
test binaries, that can be run in parallel.
The default is the number of CPUs available.
-race
enable data race detection.
Supported only on linux/amd64, freebsd/amd64, darwin/amd64 and windows/amd64.
-msan
enable interoperation with memory sanitizer.
Supported only on linux/amd64,
and only with Clang/LLVM as the host C compiler.
-v
print the names of packages as they are compiled.
-work
print the name of the temporary work directory and
do not delete it when exiting.
-x
print the commands.
-asmflags 'flag list'
arguments to pass on each go tool asm invocation.
-buildmode mode
build mode to use. See 'go help buildmode' for more.
-compiler name
name of compiler to use, as in runtime.Compiler (gccgo or gc).
-gccgoflags 'arg list'
arguments to pass on each gccgo compiler/linker invocation.
-gcflags 'arg list'
arguments to pass on each go tool compile invocation.
-installsuffix suffix
a suffix to use in the name of the package installation directory,
in order to keep output separate from default builds.
If using the -race flag, the install suffix is automatically set to race
or, if set explicitly, has _race appended to it. Likewise for the -msan
flag. Using a -buildmode option that requires non-default compile flags
has a similar effect.
-ldflags 'flag list'
arguments to pass on each go tool link invocation.
-linkshared
link against shared libraries previously created with
-buildmode=shared.
-pkgdir dir
install and load all packages from dir instead of the usual locations.
For example, when building with a non-standard configuration,
use -pkgdir to keep generated packages in a separate location.
-tags 'tag list'
a list of build tags to consider satisfied during the build.
For more information about build tags, see the description of
build constraints in the documentation for the go/build package.
-toolexec 'cmd args'
a program to use to invoke toolchain programs like vet and asm.
For example, instead of running asm, the go command will run
'cmd args /path/to/asm <arguments for asm>'.
The list flags accept a space-separated list of strings. To embed spaces
in an element in the list, surround it with either single or double quotes.
For more about specifying packages, see 'go help packages'.
For more about where packages and binaries are installed,
run 'go help gopath'.
For more about calling between Go and C/C++, run 'go help c'.
Note: Build adheres to certain conventions such as those described
by 'go help gopath'. Not all projects can follow these conventions,
however. Installations that have their own conventions or that use
a separate software build system may choose to use lower-level
invocations such as 'go tool compile' and 'go tool link' to avoid
some of the overheads and design decisions of the build tool.
See also: go install, go get, go clean.
Код: Выделить всё
maksim@maksim-MS-7519 /usr/lib/python3.4 $ cd ..
maksim@maksim-MS-7519 /usr/lib $ cd home/maksim
bash: cd: home/maksim: No such file or directory
maksim@maksim-MS-7519 /usr/lib $ cd /home/maksim
maksim@maksim-MS-7519 ~ $ pwd
/home/maksim
maksim@maksim-MS-7519 ~ $ cd Progy/Go
maksim@maksim-MS-7519 ~/Progy/Go $ cd src
maksim@maksim-MS-7519 ~/Progy/Go/src $ pwd
/home/maksim/Progy/Go/src
maksim@maksim-MS-7519 ~/Progy/Go/src $ go install -buildmode=shared -linkshared std
go install runtime/internal/sys: mkdir /usr/local/go/pkg/linux_386_dynlink: permission denied
maksim@maksim-MS-7519 ~/Progy/Go/src $ su
Password:
maksim-MS-7519 src # go install -buildmode=shared -linkshared std
The program 'go' is currently not installed. You can install it by typing:
apt-get install gccgo-go
maksim-MS-7519 src #
go install -buildmode=shared -linkshared std
компилятор gccgo-go, НО в нем не определён флаг -buildmode как я уже писал выше
Замкнутый круг получается
Надо подумать
- perseus
- Писатель
- Сообщения: 99
- Зарегистрирован: 11 май 2017, 18:01
- Откуда: Щёлково, Московская обл.
- Контактная информация:
Re: cборка приложений Go
Код: Выделить всё
maksim-MS-7519 maksim # go version
go version xgcc (Ubuntu 4.9.3-0ubuntu4) 4.9.3 linux/386
maksim-MS-7519 maksim # pwd
/home/maksim
maksim-MS-7519 maksim # cd Progy/Go/src
maksim-MS-7519 src # go install -buildmode=shared -linkshared std
flag provided but not defined: -buildmode
usage: install [build flags] [packages]
Install compiles and installs the packages named by the import paths,
along with their dependencies.
For more about the build flags, see 'go help build'.
For more about specifying packages, see 'go help packages'.
See also: go build, go get, go clean.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей