Cygwin安装与配置

安装Cygwi

基本选项

Cygwin

选择通过网络安装 选择root目录,安装用户选择仅个人 选择安装的包的路径 使用系统代理,选择下载源如中科大的或阿里云等国内下载源

安装工具选择

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
  binutils
  gcc-core
  gdb
  mingw64-i686-gcc-core
  make(必装)
  cmake
  screen
  # 还有的如:
  openssh
  unzip
  vim
  tmux
  git
  wget
  curl
  zip
  bc
  dos2unix
  w3m
  lynx
  emacs
  rsync
  expect
  jq
  cpio

cygwin 命令行安装库

cygwin安装程序介绍

在Cygwin中安装库的过程通常涉及使用Cygwin的包管理工具setup.exe。以下是通过命令行安装库的步骤:

  1. 打开Cygwin终端。
  2. 输入setup.exe -q命令来运行安装程序,并进入交互式安装模式。
  3. 当安装程序启动时,选择需要安装的库。
  4. 选择库后,按照屏幕上的提示进行安装。

如果你想要在不启动setup.exe的情况下从命令行安装库,可以使用以下命令:

1
  ./setup-x86_64.exe -q -P <package_name>

其中<package_name>是你想要安装的库的名称。例如,如果你想要安装openssh,你可以运行:

1
  ./setup-x86_64.exe -q -P openssh

请注意,你可能需要管理员权限来安装库,这取决于你的操作系统设置。如果是这样,你需要以管理员身份运行Cygwin终端。

前提

  1. exe 程序需要放到cgwin的目录下
  2. 运行程序之前必须先安装cygwin

一键安装命令

1
./setup-x86_64.exe -q -P binutils gcc-core gdb mingw64-i686-gcc-core make cmake screen openssh unzip vim tmux git wget curl zip bc dos2unix w3m lynx emacs rsync expect jq cpio

配置apt-cyg

方式一

用记事本创建一个名为apt-cyg的文件,复制粘贴进去如下内容,并且文本写完后,用vscode打开,把windows下的换行符CRLF改成linux下的LF 接下来,把刚刚的apt-cyg文件剪贴到Cygwin安装目录的bin文件夹里

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
  #!/bin/bash
  # apt-cyg: install tool for Cygwin similar to debian apt-get
  #
  # The MIT License (MIT)
  #
  # Copyright (c) 2013 Trans-code Design
  #
  # Permission is hereby granted, free of charge, to any person obtaining a copy
  # of this software and associated documentation files (the "Software"), to deal
  # in the Software without restriction, including without limitation the rights
  # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  # copies of the Software, and to permit persons to whom the Software is
  # furnished to do so, subject to the following conditions:
  #
  # The above copyright notice and this permission notice shall be included in
  # all copies or substantial portions of the Software.
  #
  # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  # THE SOFTWARE.

  if [ ${BASH_VERSINFO}${BASH_VERSINFO[1]} -lt 42 ]
  then
	echo 'Bash version 4.2+ required'
	exit
  fi

  usage="\
  NAME
	apt-cyg - package manager utility

  SYNOPSIS
	apt-cyg [operation] [options] [targets]

  DESCRIPTION
	apt-cyg is a package management utility that tracks installed packages on a
	Cygwin system. Invoking apt-cyg involves specifying an operation with any
	potential options and targets to operate on. A target is usually a package
	name, file name, URL, or a search string. Targets can be provided as command
	line arguments.

  OPERATIONS
	install
	  Install package(s).

	remove
	  Remove package(s) from the system.

	update
	  Download a fresh copy of the master package list (setup.ini) from the
	  server defined in setup.rc.

	download
	  Retrieve package(s) from the server, but do not install/upgrade anything.

	show
	  Display information on given package(s).

	depends
	  Produce a dependency tree for a package.

	rdepends
	  Produce a tree of packages that depend on the named package.

	list
	  Search each locally-installed package for names that match regexp. If no
	  package names are provided in the command line, all installed packages will
	  be queried.

	listall
	  This will search each package in the master package list (setup.ini) for
	  names that match regexp.

	category
	  Display all packages that are members of a named category.

	listfiles
	  List all files owned by a given package. Multiple packages can be specified
	  on the command line.

	search
	  Search for downloaded packages that own the specified file(s). The path can
	  be relative or absolute, and one or more files can be specified.

	searchall
	  Search cygwin.com to retrieve file information about packages. The provided
	  target is considered to be a filename and searchall will return the
	  package(s) which contain this file.

	mirror
	  Set the mirror; a full URL to a location where the database, packages, and
	  signatures for this repository can be found. If no URL is provided, display
	  current mirror.

	cache
	  Set the package cache directory. If a file is not found in cache directory,
	  it will be downloaded. Unix and Windows forms are accepted, as well as
	  absolute or regular paths. If no directory is provided, display current
	  cache.

  OPTIONS
	--nodeps
	  Specify this option to skip all dependency checks.

	--version
	  Display version and exit.
  "

  version="\
  apt-cyg version 1

  The MIT License (MIT)

  Copyright (c) 2005-9 Stephen Jungels
  "

  function wget {
	if command wget -h &>/dev/null
	then
	  command wget "$@"
	else
	  warn wget is not installed, using lynx as fallback
	  set "${*: -1}"
	  lynx -source "$1" > "${1##*/}"
	fi
  }

  function find-workspace {
	# default working directory and mirror

	# work wherever setup worked last, if possible
	cache=$(awk '
	BEGIN {
	  RS = "\n\\<"
	  FS = "\n\t"
	}
	$1 == "last-cache" {
	  print $2
	}
	' /etc/setup/setup.rc)

	mirror=$(awk '
	/last-mirror/ {
	  getline
	  print $1
	}
	' /etc/setup/setup.rc)
	mirrordir=$(sed '
	s / %2f g
	s : %3a g
	' <<< "$mirror")

	mkdir -p "$cache/$mirrordir/$arch"
	cd "$cache/$mirrordir/$arch"
	if [ -e setup.ini ]
	then
	  return 0
	else
	  get-setup
	  return 1
	fi
  }

  function get-setup {
	touch setup.ini
	mv setup.ini setup.ini-save
	wget -N $mirror/$arch/setup.bz2
	if [ -e setup.bz2 ]
	then
	  bunzip2 setup.bz2
	  mv setup setup.ini
	  echo Updated setup.ini
	else
	  echo Error updating setup.ini, reverting
	  mv setup.ini-save setup.ini
	fi
  }

  function check-packages {
	if [[ $pks ]]
	then
	  return 0
	else
	  echo No packages found.
	  return 1
	fi
  }

  function warn {
	printf '\e[1;31m%s\e[m\n' "$*" >&2
  }

  function apt-update {
	if find-workspace
	then
	  get-setup
	fi
  }

  function apt-category {
	check-packages
	find-workspace
	for pkg in "${pks[@]}"
	do
	  awk '
	  $1 == "@" {
		pck = $2
	  }
	  $1 == "category:" && $0 ~ query {
		print pck
	  }
	  ' query="$pks" setup.ini
	done
  }

  function apt-list {
	local sbq
	for pkg in "${pks[@]}"
	do
	  let sbq++ && echo
	  awk 'NR>1 && $1~pkg && $0=$1' pkg="$pkg" /etc/setup/installed.db
	done
	let sbq && return
	awk 'NR>1 && $0=$1' /etc/setup/installed.db
  }

  function apt-listall {
	check-packages
	find-workspace
	local sbq
	for pkg in "${pks[@]}"
	do
	  let sbq++ && echo
	  awk '$1~pkg && $0=$1' RS='\n\n@ ' FS='\n' pkg="$pkg" setup.ini
	done
  }

  function apt-listfiles {
	check-packages
	find-workspace
	local pkg sbq
	for pkg in "${pks[@]}"
	do
	  (( sbq++ )) && echo
	  if [ ! -e /etc/setup/"$pkg".lst.gz ]
	  then
		download "$pkg"
	  fi
	  gzip -cd /etc/setup/"$pkg".lst.gz
	done
  }

  function apt-show {
	find-workspace
	check-packages
	for pkg in "${pks[@]}"
	do
	  (( notfirst++ )) && echo
	  awk '
	  $1 == query {
		print
		fd++
	  }
	  END {
		if (! fd)
		  print "Unable to locate package " query
	  }
	  ' RS='\n\n@ ' FS='\n' query="$pkg" setup.ini
	done
  }

  function apt-depends {
	find-workspace
	check-packages
	for pkg in "${pks[@]}"
	do
	  awk '
	  @include "join"
	  $1 == "@" {
		apg = $2
	  }
	  $1 == "requires:" {
		for (z=2; z<=NF; z++)
		  reqs[apg][z-1] = $z
	  }
	  END {
		prpg(ENVIRON["pkg"])
	  }
	  function smartmatch(small, large,    values) {
		for (each in large)
		  values[large[each]]
		return small in values
	  }
	  function prpg(fpg) {
		if (smartmatch(fpg, spath)) return
		spath[length(spath)+1] = fpg
		print join(spath, 1, length(spath), " > ")
		if (isarray(reqs[fpg]))
		  for (each in reqs[fpg])
			prpg(reqs[fpg][each])
		delete spath[length(spath)]
	  }
	  ' setup.ini
	done
  }

  function apt-rdepends {
	find-workspace
	for pkg in "${pks[@]}"
	do
	  awk '
	  @include "join"
	  $1 == "@" {
		apg = $2
	  }
	  $1 == "requires:" {
		for (z=2; z<=NF; z++)
		  reqs[$z][length(reqs[$z])+1] = apg
	  }
	  END {
		prpg(ENVIRON["pkg"])
	  }
	  function smartmatch(small, large,    values) {
		for (each in large)
		  values[large[each]]
		return small in values
	  }
	  function prpg(fpg) {
		if (smartmatch(fpg, spath)) return
		spath[length(spath)+1] = fpg
		print join(spath, 1, length(spath), " < ")
		if (isarray(reqs[fpg]))
		  for (each in reqs[fpg])
			prpg(reqs[fpg][each])
		delete spath[length(spath)]
	  }
	  ' setup.ini
	done
  }

  function apt-download {
	check-packages
	find-workspace
	local pkg sbq
	for pkg in "${pks[@]}"
	do
	  (( sbq++ )) && echo
	  download "$pkg"
	done
  }

  function download {
	local pkg digest digactual
	pkg=$1
	# look for package and save desc file

	awk '$1 == pc' RS='\n\n@ ' FS='\n' pc=$pkg setup.ini > desc
	if [ ! -s desc ]
	then
	  echo Unable to locate package $pkg
	  exit 1
	fi

	# download and unpack the bz2 or xz file

	# pick the latest version, which comes first
	set -- $(awk '$1 == "install:"' desc)
	if (( ! $# ))
	then
	  echo 'Could not find "install" in package description: obsolete package?'
	  exit 1
	fi

	dn=$(dirname $2)
	bn=$(basename $2)

	# check the md5
	digest=$4
	case ${#digest} in
	  32) hash=md5sum    ;;
	  128) hash=sha512sum ;;
	esac
	mkdir -p "$cache/$mirrordir/$dn"
	cd "$cache/$mirrordir/$dn"
	if ! test -e $bn || ! $hash -c <<< "$digest $bn"
	then
	  wget -O $bn $mirror/$dn/$bn
	  $hash -c <<< "$digest $bn" || exit
	fi

	tar tf $bn | gzip > /etc/setup/"$pkg".lst.gz
	cd ~-
	mv desc "$cache/$mirrordir/$dn"
	echo $dn $bn > /tmp/dwn
  }

  function apt-search {
	check-packages
	echo Searching downloaded packages...
	for pkg in "${pks[@]}"
	do
	  key=$(type -P "$pkg" | sed s./..)
	  [[ $key ]] || key=$pkg
	  for manifest in /etc/setup/*.lst.gz
	  do
		if gzip -cd $manifest | grep -q "$key"
		then
		  package=$(sed '
		  s,/etc/setup/,,
		  s,.lst.gz,,
		  ' <<< $manifest)
		  echo $package
		fi
	  done
	done
  }

  function apt-searchall {
	cd /tmp
	for pkg in "${pks[@]}"
	do
	  printf -v qs 'text=1&arch=%s&grep=%s' $arch "$pkg"
	  wget -O matches cygwin.com/cgi-bin2/package-grep.cgi?"$qs"
	  awk '
	  NR == 1 {next}
	  mc[$1]++ {next}
	  /-debuginfo-/ {next}
	  /^cygwin32-/ {next}
	  {print $1}
	  ' FS=-[[:digit:]] matches
	done
  }

  function apt-install {
	check-packages
	find-workspace
	local pkg dn bn requires wr package sbq script
	for pkg in "${pks[@]}"
	do

	  if grep -q "^$pkg " /etc/setup/installed.db
	  then
		echo Package $pkg is already installed, skipping
		continue
	  fi
	  (( sbq++ )) && echo
	  echo Installing $pkg

	  download $pkg
	  read dn bn </tmp/dwn
	  echo Unpacking...

	  cd "$cache/$mirrordir/$dn"
	  tar -x -C / -f $bn
	  # update the package database

	  awk '
	ins != 1 && pkg < $1 {
	  print pkg, bz, 0
	  ins = 1
	}
	1
	END {
	  if (ins != 1) print pkg, bz, 0
	}
	' pkg="$pkg" bz=$bn /etc/setup/installed.db > /tmp/awk.$$
	  mv /etc/setup/installed.db /etc/setup/installed.db-save
	  mv /tmp/awk.$$ /etc/setup/installed.db

	  [ -v nodeps ] && continue
	  # recursively install required packages

	  requires=$(awk '$1=="requires", $0=$2' FS=': ' desc)
	  cd ~-
	  wr=0
	  if [[ $requires ]]
	  then
		echo Package $pkg requires the following packages, installing:
		echo $requires
		for package in $requires
		do
		  if grep -q "^$package " /etc/setup/installed.db
		  then
			echo Package $package is already installed, skipping
			continue
		  fi
		  apt-cyg install --noscripts $package || (( wr++ ))
		done
	  fi
	  if (( wr ))
	  then
		echo some required packages did not install, continuing
	  fi

	  # run all postinstall scripts

	  [ -v noscripts ] && continue
	  find /etc/postinstall -name '*.sh' | while read script
	  do
		echo Running $script
		$script
		mv $script $script.done
	  done
	  echo Package $pkg installed

	done
  }

  function apt-remove {
	check-packages
	cd /etc
	cygcheck awk bash bunzip2 grep gzip mv sed tar xz > setup/essential.lst
	for pkg in "${pks[@]}"
	do

	  if ! grep -q "^$pkg " setup/installed.db
	  then
		echo Package $pkg is not installed, skipping
		continue
	  fi

	  if [ ! -e setup/"$pkg".lst.gz ]
	  then
		warn Package manifest missing, cannot remove $pkg. Exiting
		exit 1
	  fi
	  gzip -dk setup/"$pkg".lst.gz
	  awk '
	NR == FNR {
	  if ($NF) ess[$NF]
	  next
	}
	$NF in ess {
	  exit 1
	}
	' FS='[/\\\\]' setup/{essential,$pkg}.lst
	  esn=$?
	  if [ $esn = 0 ]
	  then
		echo Removing $pkg
		if [ -e preremove/"$pkg".sh ]
		then
		  preremove/"$pkg".sh
		  rm preremove/"$pkg".sh
		fi
		mapfile dt < setup/"$pkg".lst
		for each in ${dt[*]}
		do
		  [ -f /$each ] && rm /$each
		done
		for each in ${dt[*]}
		do
		  [ -d /$each ] && rmdir --i /$each
		done
		rm -f setup/"$pkg".lst.gz postinstall/"$pkg".sh.done
		awk -i inplace '$1 != ENVIRON["pkg"]' setup/installed.db
		echo Package $pkg removed
	  fi
	  rm setup/"$pkg".lst
	  if [ $esn = 1 ]
	  then
		warn apt-cyg cannot remove package $pkg, exiting
		exit 1
	  fi

	done
  }

  function apt-mirror {
	if [ "$pks" ]
	then
	  awk -i inplace '
	  1
	  /last-mirror/ {
		getline
		print "\t" pks
	  }
	  ' pks="$pks" /etc/setup/setup.rc
	  echo Mirror set to "$pks".
	else
	  awk '
	  /last-mirror/ {
		getline
		print $1
	  }
	  ' /etc/setup/setup.rc
	fi
  }

  function apt-cache {
	if [ "$pks" ]
	then
	  vas=$(cygpath -aw "$pks")
	  awk -i inplace '
	  1
	  /last-cache/ {
		getline
		print "\t" vas
	  }
	  ' vas="${vas//\\/\\\\}" /etc/setup/setup.rc
	  echo Cache set to "$vas".
	else
	  awk '
	  /last-cache/ {
		getline
		print $1
	  }
	  ' /etc/setup/setup.rc
	fi
  }

  if [ -p /dev/stdin ]
  then
	mapfile -t pks
  fi

  # process options
  until [ $# = 0 ]
  do
	case "$1" in

	  --nodeps)
		nodeps=1
		shift
		;;

	  --noscripts)
		noscripts=1
		shift
		;;

	  --version)
		printf "$version"
		exit
		;;

	  update)
		command=$1
		shift
		;;

	  list | cache  | remove | depends | listall  | download | listfiles |\
		show | mirror | search | install | category | rdepends | searchall )
		if [[ $command ]]
		then
		  pks+=("$1")
		else
		  command=$1
		fi
		shift
		;;

	  ,*)
		pks+=("$1")
		shift
		;;

	esac
  done

  set -a

  if type -t apt-$command | grep -q function
  then
	readonly arch=${HOSTTYPE/i6/x}
	apt-$command
  else
	printf "$usage"
  fi

方式二

虽然我们上面安装好了 Cygwin,但还是很不方便,为什么呢?主要是因为 Cygwin目前设计的还不是很人性化。如果我们安装好Cygwin后,如果缺少了某个包想安装的话就特别麻烦。还需要重新安装 Cygwin才能解决,有没有更好的方式呢?

你遇到的困难,别人也会遇到,不同的是你要么忍了,要么不用了。可别人遇到困难后会去解决困难,这才是人与人之间最大的不同。

话扯的有点远哈。没错,已经有人帮我们解决了这个问题。这是一个很好用的开源工具,它叫 apt-cyg。它与 Ubuntu系统中的 apt一样特别好用,而且使用的方式与 apt也是一个样子的。

如何安装它呢?网上有很多方法,但很多不可行。大家按我这个方法操作一定可以安装成功。

其实,apt-cyg就是一个脚本。我们只需要将这个脚本下载下来就OK了。这里是apt-cyg的下载地址。大家可以在Cygwin下执行下面的命令就好了。

第一步:

1
  wget -c https://raw.githubusercontent.com/transcode-open/apt-cyg/master/apt-cyg

第二步:

1
  install apt-cyg /bin

需要添加的环境变量

1
2
3
  C:\Cygwin\bin
  C:\Cygwin\sbin
  C:\Cygwin\usr\sbin

在当前文件夹打开

可以在文件资源管理器的地址栏运行cygwin的mintty,前提是设置好环境变量

Licensed under CC BY-NC-SA 4.0
最后更新于 Jul 08, 2025 18:57 +0800
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计