cборка приложений Go

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: cборка приложений Go

Непрочитанное сообщение Olej » 12 май 2017, 14:44

perseus писал(а):я пользуюсь Linux Mint 17
Ну ... слава Богу! :lol: Это уже куда безопаснее чем Ubuntu. :cry:

У меня на разных машинах есть установленные Mint 17.3 и 18.1 ... я посмотрю и сравню (чуть позже ... их включать надо ;-) ).
P.S. Мне очень странно откуда вы взяли в Mint 17 версии Go порядка 1.7.1 ... там всё должно быть гораздо более старое? :-o
perseus писал(а): Так что всётаки скажите, Олег Иванович, о сборке программ со сторонними пакетами в Go ?
мне кажется есть что в ваш конспект добавить ;-)
Добавить то - дел не хитрое... ;-)
Только нужно прежде разобраться, наблюдаем мы здесь реальную проблему ... или это только кажется? ;-) , или ошибки сборки? ... отмоделировать, проверить ...
И смотреть это можно только на реальных прототипах, примерах кода, которые вы за 2-3 дня обсуждения ничего так и не показали. ;-)

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: cборка приложений Go

Непрочитанное сообщение Olej » 12 май 2017, 14:51

perseus писал(а):я удалил пакет gcc-go и версия go такая:
Ничего не нужно скоропалительно удалять или устанавливать! (это порождает только истерику, а не понимание).

Реализации Go от Golang & GCC - замечательно сосуществуют и используются параллельно, совместно.

А переключаться между тем, какой из них использовать, можно легко (секундно ;-) ) средствами такого инструмента Linux как alternatives. Подробно это можно посмотреть здесь: Инструменты Go (+/-2-3 сообщения от ссылки) и alternatives.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: cборка приложений Go

Непрочитанное сообщение Olej » 12 май 2017, 14:56

perseus писал(а):Так в каких случайх go собирает статические приложения, а в каких динамические ? И от чего это зависит ?
Ясности пока нет на практике.
Это радикальным образом зависит от того, каким компилятором (и сопутствующим ему инструментарием) вы пользуетесь.
А во-вторых, и тот и другой проект (Golang & GCC Go) позволяют (в более-менее последних версиях) производить и статическую и динамическую сборку.
И, в-третьих, существуют ещё и другие (и активно используемые) проекты реализации Go сверх даже этих 2-х ... : в рамках того же проекта LLVM (где Clang) ... но и он не последний.

Аватара пользователя
perseus
Писатель
Сообщения: 99
Зарегистрирован: 11 май 2017, 18:01
Откуда: Щёлково, Московская обл.
Контактная информация:

Re: cборка приложений Go

Непрочитанное сообщение perseus » 12 май 2017, 14:58

Согласен, разобраться необходимо, я поэтому к вам и обратился с этим вопросом, как к серьёзносу и уважаемому эксперту.
Касательно версии go 1.7.7 - я установил её в Минт17 скачав с сайта http://www.golang.org
Я вам очень благодарен за подсказки по теме.
Касательно прототипов кода - мне кажется дело не в коде программ, а в том какие пакеты импортируешь в программу.
Но если вы всётаки будете настаивать на примере кода, я его конечно выложу, секретов тут нет.

Аватара пользователя
perseus
Писатель
Сообщения: 99
Зарегистрирован: 11 май 2017, 18:01
Откуда: Щёлково, Московская обл.
Контактная информация:

Re: cборка приложений Go

Непрочитанное сообщение perseus » 12 май 2017, 15:25

Кстати в Минте17 нет доступа к проге alternatives, вместо неё предлагается galternatives с графическим интерфейсом,
которая ничего не даёт поменять :-(

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: cборка приложений Go

Непрочитанное сообщение Olej » 12 май 2017, 15:26

perseus писал(а):Касательно прототипов кода - мне кажется дело не в коде программ, а в том какие пакеты импортируешь в программу.
Дело не в самом коде, а в том, как и чем он собирается, в Makefile ... но без прототипа кода приложения собирать нечего и рассуждать не о чем.
perseus писал(а):Но если вы всётаки будете настаивать на примере кода, я его конечно выложу, секретов тут нет.
Мне ваши секреты не нужны ;-) ... как, собственно, и ваш код если он большой - разбираться в большом коде никто не станет.
В таких случаях (когда нужно разобраться):
- пишется небольшое приложение, a'la Hello World ... (возможно как минимальная "вырезка" из не складывающего приложения);
- на нём делается сборка и разбирательство с проблемой;
Эта, кажущаяся, "лишняя" работа экономит очень много времени при работе над реальными крупными разработками.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: cборка приложений Go

Непрочитанное сообщение Olej » 12 май 2017, 15:30

perseus писал(а):Касательно версии go 1.7.7 - я установил её в Минт17 скачав с сайта http://www.golang.org
Так это у вас явно проект Golang и он никакого касательства к GCC не имеет.

Код: Выделить всё

olej@nvidia ~/2017_WORK $ lsb_release -a
No LSB modules are available.
Distributor ID:	LinuxMint
Description:	Linux Mint 18.1 Serena
Release:	18.1
Codename:	serena
[code]
olej@nvidia ~/2017_WORK $ apt list gccgo* | wc -l
78
[/code]
78 пакетов относящихся к проекту GCC Go.

Аватара пользователя
perseus
Писатель
Сообщения: 99
Зарегистрирован: 11 май 2017, 18:01
Откуда: Щёлково, Московская обл.
Контактная информация:

Re: cборка приложений Go

Непрочитанное сообщение perseus » 12 май 2017, 15:48

ну вот простой пример - UDPserver для отладки:

Код: Выделить всё

// UDP-эхо-сервер для отладки UDP соединения
package main

import(
"io"
"fmt"
"log"
"net"
"my_package/structures"
"imitator/params"
"unsafe"
"time"
)

func main() {
	
	// Переменные программы
var PVTcount	uint8	//счётчик повторной выдачи сообщений
var PCHcount	uint8	//счётчик предельного числа последовательных сбоев

	// Адрес
	myAddr, err := net.ResolveUDPAddr("udp", "localhost:8000")
	if err != nil {
		log.Fatal("ResolveUDPAddr:",err)
	}
	conn, err := net.ListenUDP("udp", myAddr)
	if err != nil {
		log.Fatal("ListenUDP:",err)
	}
	defer conn.Close()

	// Структура с информацией
	var ztech structures.Z_Tech
	buf := make([]byte, unsafe.Sizeof(ztech))

	// Таймер
	tick := time.Tick(500*time.Millisecond)	// Таймер

	// читаем из соединения
	for {
		n, cliAddr, err := conn.ReadFrom(buf)
		if err == io.EOF {
			log.Println(err)
		} else if err != nil {
			log.Fatal(err)
		}
		fmt.Printf("От абонента %s полученно %d байт данные: %v\n", cliAddr.String(),n,buf)
		
	// Реконструируем структуру из буфера
	ztech, err := structures.ReconstrZ_Tech(buf) //метод восстановления структуры
	if err !=nil {
		log.Println("Восстановление не получилось")
	}
	fmt.Println("Реконструированная структура:", ztech)
		switch ztech.Ks { //изменяем поля принятой структуры
			case params.Z_INI:
				ztech.Ks = params.Z_OTV
				ztech.Bstrm = params.ISPR
				ztech.Prior = params.NO_ZAPRET
				ztech.Idf = 101
				PVTcount = 0
				PCHcount = 0
			case params.Z_OTV:

			default:
				ztech.Ks = params.Z_INI
				ztech.Bstrm = params.ISPR
				ztech.Prior = params.NO_ZAPRET
				ztech.Idf = 101
				PVTcount++
				PCHcount++
		}
	//Задержка отправления
		<- tick

		// записываем структуру в буфер
		n, err = ztech.Read(buf)
		if err == io.EOF {
			fmt.Println("buf:", buf)
		} else {
			if err != nil {
				log.Fatal("Read:",err)
			}
		}
		n, err = conn.WriteTo(buf, cliAddr)
		fmt.Println("send to ",cliAddr.String()," ",n,"bytes")
	}
}

func echo(c net.Conn, b []byte) {
	fmt.Fprint(c, b)
	
}

а вот его сборка и анализ исполняемого файла:

Код: Выделить всё

maksim@maksim-MS-7519 ~/Progy/Go/src/udpserver $ go version
go version go1.7.1 linux/386
maksim@maksim-MS-7519 ~/Progy/Go/src/udpserver $ go build udpserver.go
maksim@maksim-MS-7519 ~/Progy/Go/src/udpserver $ ls -l
total 2336
-rwxr-xr-x 1 maksim maksim 2387123 мая   12 15:45 udpserver
-rw-r--r-- 1 maksim maksim    2375 мая   12 15:43 udpserver.go
maksim@maksim-MS-7519 ~/Progy/Go/src/udpserver $ ldd udpserver
	linux-gate.so.1 =>  (0xb7734000)
	libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb76fa000)
	libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb754b000)
	/lib/ld-linux.so.2 (0xb7735000)
maksim@maksim-MS-7519 ~/Progy/Go/src/udpserver $ file udpserver
udpserver: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), not stripped
получается динамически собранный файл, а как создать статически собранный ?

Аватара пользователя
perseus
Писатель
Сообщения: 99
Зарегистрирован: 11 май 2017, 18:01
Откуда: Щёлково, Московская обл.
Контактная информация:

Re: cборка приложений Go

Непрочитанное сообщение perseus » 12 май 2017, 15:54

Код: Выделить всё

maksim@maksim-MS-7519 ~/Progy/Go/src/udpserver $ apt list gccgo* | wc -l
37
у меня 37 пакетов

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: cборка приложений Go

Непрочитанное сообщение Olej » 12 май 2017, 15:58

perseus писал(а):ну вот простой пример - UDPserver для отладки:
Файлы (примеров, кодов) можно (и нужно! ;-) ) не копировать цитированием (хотя и это не лишнее для наглядности, иногда), а прикреплять к своему сообщению - там у вас внизу, ниже окна редактирования, есть "Имя файла", "Обзор", "Добавить файл" и т.д.
Можно хоть в архив запаковывать .tgz файлы нужные для проекта хоть поштучно прикреплять (*.go, Makefile, ...) - файлов прикреплённых может быть много.

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 6 гостей