Cygwin教程(转至http://cygwincommands.com/)

windows和linux各有其优越性,可以安装在同一台电脑上,但切换要重启。同时拥有两台电脑,一台装win,一台装linux,自然非常好,但具备此条件的不多。本文介绍cygwin,它可以让你在win下拥有linux开发环境,并且不用切换。

简单的讲述一下cygwin的安装和配置,入门级教程,还请各位一二。

首先到http://www.cygwin.com 下载setup.exe?..exe放到此目录,

点击运行,Next->

选Install from Internet,Next->

填写Root Directory,如X:\cygwin,Next->

填写Local Package Directory,如X:\cygwin\ftp,Next->

选Direct Connection,Next->

选一个较快的ftp,Next->

到了关键步骤,如果仅想安装基本系统,直接Next;如果想完整安装,则点击All旁边的旋转状图标,将Default切换至Install;如果和我一 样,仅想在命令行下写写程序,则只要将 gcc、make等开发工具选上,还有openssh等;选好后,Next->

开始下载,Take a coffee break。回来后,Next->

选择需不需要创建快捷方式。->END

点击快捷方式或X:\cygwin\cygwin.bat打开控制台,如果是域用户,按照提示makepasswd和makegroup即可。下面说一些简单的调整和配置。

一、ssh的安装

cygwin自带的控制台可调参数很少,舒适度较低。有没有办法用熟悉的putty或secureCRT来操控cygwin呢?办法有二:

1、用puttycyg。cygwin bash shell能做的,puttycyg基本上都能实现,本地操作的话,极力推荐这款好软件。

2、安装sshd,然后本机登陆。如果安装时已选择openssh,按照下面的操作继续。如果忘了安装,点击setup.exe,选上openssh,再装一次即可。

a、右键“我的电脑”->属性->高级->环境变量,在系统环境变量里添加变量CYGWIN,值为netsec tty,然后在Path里追加X:\cygwin\bin

b、打开cygwin控制台,输入ssh-host-config,一路yes,提示CYGWIN值时,输入netsec tty

c、启动sshd服务用: net start sshd 或 cygrunsrv …

admin | Cygwin, MingW |
cygwin/gcc和MinGW

cygwin/gcc和MinGW都是gcc在windows下的编译环境,但是它们有什么区别,在实际工作中如何选择这两种编译器。
cygwin/gcc完全可以和在linux下的gcc化做等号,这个可以从boost库的划分中可以看出来端倪,cygwin下的gcc和linux下的gcc完全使用的是相同的Toolsets。
所以完全可以和linux一起同步更新gcc版本,而不用担心问题,并且在cygwin/gcc做的东西(不用win32的)可以无缝的用在linux下,没有任何问题。是在windows下开发linux程序的一个很好的选择。但是在cygwin/gcc下编译出来的程序,在windows执行必须依赖cygwin1.dll,并且速度有些慢,如果不想依赖这个东西的化,必须在gcc的编译选项中加入-mno-cygwin。加入这个选项其实gcc编译器就会自动的选择在安装cygwin/gcc时安上的mingw,这个mingw就是gcc的一个交叉编译。
对于mingw作为gcc在windows上的一个实现,由于不像cygwin的gcc在一个模拟linux上运行,同时相当一部分linux的工具不能够使用,不过现在已经有Msys这个模拟unix的shell,可以解决很多的问题,不过没有cygwin好用,而cygwin/gcc的no-cygwin选项又依赖于mingw的支持,所以更新的更慢的,现在只是到3.3.3。在mingw下也是可以升级gcc的,不过需要使用msys。升级方法和在cygwin和linux下差不多,就不再罗嗦了。不过就我的升级经验来看好像都不太顺利。具体深入的测试,我也没有时间做了。
也是可以让cygwin的最新安装的gcc支持no-cygwin,需要再做一遍交叉编译,但是我不会做,只好算了,呵呵,也许那一天我把这个搞定,再开一个贴吧。
根据以上的分析,如果在windows开发linux程序,cygwin是很好的选择。如果你开发的程序不介意有一个cygwin1.dll的话,也是可以选择cygwin的。如果你是想开发windows下的程序,还要必须用gcc的化,mingw是很好的一个选择。但是在windows下有太多的编译器了,bc,vc,intel c…..。…

admin | Cygwin |
恢复Cygwin快捷方式

由于某些原因,不小心把Cygwin的快捷方式删掉了,但又找不到原程序的位置。很多人(包括本人)很受挫,索性把Cygwin重装。但是Cygwin里面辛辛苦苦建立起来的开发环境却因此一去不复返。岂不痛哉?

这里介绍手动创建Cygwin的快捷方式。

(1)首先说明一点,Cygwin的快捷方式实际上是指向一个名为Cygwin.bat的批处理文件,而不是大家常见到的.exe文件。其实原理是一样的,批处理文件跟exe文件一样都是可执行文件,不同的是现在批处理很少见了,而安全防卫软件通常就把批处理文件当成有问题程序给删掉了。

(2)找到Cygwin安装文件夹,本人安装在D:\cygwin,注意这个文件应该是真正的程序存放位置,这个目录下必须有这几个文件夹:bin, cygdriver, dev, etc, home, lib… 。

现在在刚才的目录下(D:\cygwin)创建文件 “Cygwin.bat”,注意:后缀一定是.bat。

然后编辑此文件,在其中加入如下代码:

@echo off

D:
chdir D:\cygwin\bin
set LANG=en_US.utf8
bash –login -i

最后给此文件创建快捷方式到桌面

现在工作基本完成了,唯一不足的是刚才创建的快捷方式图标是刚才的批处理文件的图标,而不是原先安装时的图标。

(3)在刚才的文件夹(D:\cygwin)下找到Cygwin.ico,正是这个图片。

现在到刚才的快捷方式上:右键–>属性–>更改图标–>浏览–>找到Cygwin.ico–>确定

 

OK啦。…

admin | Cygwin |
Cygwin使用GNU toolchain进行ARM的开发调试

label:

ARM Cygwin GNU ARM toolchain arm-linux-gcc arm-linux-ld arm-linux-*

笔者刚开始用arm-linux tool chain开发arm程序的时候是在虚拟机的linux环境中进行的。前段时间试用了一下Cygwin,发现这个真是个好东西。相对于虚拟机中的linux,它有以下好处:

①虚拟的linux环境,不会占用太多的主机资源,不用安装虚拟机,程序开启速度很快,打开就可以用

②Cygwin的源中有很多优秀的工具,它们本来是在linux下使用的,现在移植好到windows下了,而且可以根据自己的需要来安装,再者,使用Cygwin可以调用windows下的字符界面的程序,方便的共享windows下的硬盘空间

③最重要的,是在windows下有很多GNU arm的开发工具,它们跟linux上的tool-chain没什么区别,在Cygwin中一样好使

 

下面简述一下我的安装过程。我自己的环境:笔记本T60,windows7 旗舰版。所需要的软件:Cygwin的安装工具http://cygwin.com/setup.exe,YAGARTO – another GNU ARM toolchain(用于windows下开发arm的GNU ARM工具链)。

Cygwin的安装过程就不再详细说明了,网上的教程非常多。我的网络性能还比较好,我选择的在线安装,使用的是台湾一所大学的源,速度还是很赞的。一开始所安装的工具都是默认的(不要选择全部安装,那样安装会非常慢,因为要下载大量资源,占用大量空间,而且里面的工具很多都用不到),随后我自己又升级安装了vim、gcc、inetutils、ssh工具.inetutils这个是个整合的网络工具包,里面包含了ftp、telnet、tftp、ftpd等工具,很实用。最后我还选择安装了mintty这个终端工具(在源里有),可以任意更改字体,有右键菜单,很好使。

GNU ARM toolchain在源中是没有的,要自己去下载。目前的toolchain有以下几种:(via http://embdev.net/topic/129986#new

        CodeSourcery (Thumb-2 supported)

      

admin | Cygwin |
cygwin设置中文

cygwin设置中文
cygwin\home\username\.bashrc
# 让ls和dir命令显示中文和颜色
alias ls='ls --show-control-chars --color'
alias dir='dir -N --color'
# 设置为中文环境,使提示成为中文
export LANG="zh_CN.GBK"
# 输出为中文编码
export OUTPUT_CHARSET="GBK"
cygwin\home\username\.inputrc
# 可以输入中文
set meta-flag on
set output-meta on
set convert-meta off
# 忽略大小写
set completion-ignore-case on
, cygwin.bat: 

@ECHO …

admin | Cygwin |
Windows平台上iPhone SDK基于cygwin开发环境的搭建

1. 在http://code.google.com/p/winchain/网站下载preBuiltToolchain.rar和winChain 1.0.1.zip
2. 解压preBuiltToolchain.rar到d盘根目录,解压后的目录如下:

3. 解压winChain 1.0.1.zip,然后运行其中的winChain.exe程序,这个程序需要.net 2.0环境,如果运行出错,提示缺少.net环境,如:

则需要先安装.NET Framework v2.0.50727,这个可以从http://ishare.iask.sina.com.cn/cgi-bin/fileid.cgi?fileid=2058162下载,下载后安装成功后就可以正常运行winChain.exe程序了。运行后界面如下:
4. 安装iphone的Toolchain
点击“Browse”按钮,然后选择第2步解压的目录d:\preBuildToolchain,然后点击“Copy Toolchain Files into Place”按钮,这将d:\preBuildToolchain目录下的所有文件和目录移动到d:\cygwin。

5. 安装cygwin
由于winChain 1.0.1有一个bug, “Install Cygwin Environment”仍然置灰不能使用,winChain的作者说将在1.0.2版本修改这个bug,不过目前1.0.2版本没有release。笔者当时因为这个问题疑惑了一段时间,以为用winChain不能正确安装,后来仔细看了winChain的作者的描述,才知道下一步只要安装cygwin即可。在winChain 1.0.1.zip解压后的目录中\winChain 1.0.1\Resources中,运行InstallCygwin.exe,之后一路按“下一步”,到选择“安装目录”时,把 Root Directory 一栏修改成 D:\cygwin,这是因为我们把preBuildToolchain解压在D盘,如果解压在C盘,则不需要修改。

之后一路按“下一步”,直到选择下载源时,如下图:

直接在URL里输入http://www.cygwin.cn/pub/,然后点击”Add”按钮,之后一路按“下一步”,cygwin将安装成功!…

admin | Cygwin |
cygwin镜像源 163源

http://mirrors.163.com/cygwin/

163 china

ftp://mirror.cs.vt.edu/pub/cygwin/cygwin/
mirror.cs.vt.edu;United States;Virginia

http://www.mirrorservice.org/sites/sourceware.org/pub/cygwin/

www.mirrorservice.org;Europe;UK

http://ftp.eq.uc.pt/software/pc/prog/cygwin/

ftp.eq.uc.pt;Europe;Portugal

http://repo.fedoramd.org/mirrors/cygwin/

repo.fedoramd.org;Europe;Moldova

http://ftp.cc.uoc.gr/mirrors/cygwin/

ftp.cc.uoc.gr;Europe;Greece

http://ftp-stud.fht-esslingen.de/pub/Mirrors/sources.redhat.com/cygwin/

ftp-stud.fht-esslingen.de;Europe;Germany

http://mirrors.dotsrc.org/cygwin/

mirrors.dotsrc.org;Europe;Denmark

http://ftp.twaren.net/Unix/Sourceware/cygwin/

ftp.twaren.net;Asia;Taiwan

http://mirror.averse.net/cygwin/

mirror.averse.net;Asia;Singapore

http://cygwin.internet.bs/

cygwin.internet.bs;Asia;Hong Kong

http://cygwin.elite-systems.org/

cygwin.elite-systems.org;United States;California

http://repo.fedoramd.org/mirrors/cygwin/

repo.fedoramd.org;Europe;Moldova

http://cygwin.osuosl.org/

cygwin.osuosl.org;United States;Oregon

http://mirror.nvi.net/cygwin/

mirror.nvi.net:United States:New York

http://ftp.fsn.hu/pub/cygwin/

ftp.fsn.hu;Europe;Hungary

Cygwin国内镜像…

admin | Cygwin |
cygwin的安装和配置

windows和linux各有其优越性,可以安装在同一台电脑上,但切换要重启。同时拥有两台电脑,一台装win,一台装linux,自然非常好,但具备此条件的不多。本文介绍cygwin,它可以让你在win下拥有linux开发环境,并且不用切换。

简单的讲述一下cygwin的安装和配置,入门级教程,还请各位高手指点一二。

首先到http://www.cygwin.com下载setup.exe,接着建立安装目录,如X:\cygwin,将setup.exe放到此目录,

 

BEGIN-> 点击setup.exe,Next->选Install from Internet,Next->填写Root Directory,如X:\cygwin,Next->填写Local Package Directory,如X:\cygwin\ftp,Next->

 

选Direct Connection,Next->

选一个较快的ftp,Next->

到了关键步骤,如果仅想安装基本系统,直接Next;如果想完全安装,点击All旁边的旋转状图标,将Default切换至Install;如果和我一 样,仅想在命令行下写写程序,则只要将 gcc、make等开发工具选上,还有openssh等;选好后,Next->

开始下载,Take a coffee break。回来后,Next->

选择需不需要创建快捷方式。->END

 
点击快捷方式或X:\cygwin\cygwin.bat打开控制台,如果是域用户,按照提示makepasswd和makegroup即可。下面说一些简单的调整和配置。

一、ssh的安装

cygwin自带的控制台可调参数很少,舒适度较低。有没有办法用熟悉的PuTTY或SecureCRT来操控cygwin呢?办法有二:

1、用PuTTYcyg。地址是http://gecko.gc.maricopa.edu/~medgar/puttycyg/。用法很简单,在配置对话框中,host name填 – 即可。Cygwin Bash Shell能做的,PuTTYcyg基本上都能实现,本地操作的话,极力推荐这款好软件。

2、安装sshd,本机登陆。如果忘了安装OpenSSH,点击setup.exe,选上OpenSSH,再装一次即可。如果已安装,按照下面的操作继续:…

admin | Cygwin |
cygwin使用心得

1.在cygwin里访问Windows盘
cd /cygdrive/c
cd c:

2.整合cygwin命令到Windows中
假设cygwin安装在d:/develop/cygwin,则将d:/develop/cygwin/bin添加到系统变量PATH中(最好加在windows前面,这样的话,有些相同的命令的话,是先执行cygwin的命令,而不是windows命令,比如find)

就可以直接在cmd.exe下面执行tar czvf xxx.tgz ./
基本上所有的命令都可以用了,包括ls,more,less,find,grep等。

3.使用TGZ备份
将cygwin的BIN加入到PATH
建一个BAT文件:
@echo off
d:
cd d:\website\8thmanage
tar czvf 8thmanage.tgz 8thmanage

4.Windows使用SHELL脚本
将…

admin | Cygwin |
Cygwin使用方法

由于自己的项目需要使用Linux内核,所以自己在windows下安装了一个Linux虚拟机!自己实在忍受不了这种速度,随想用cygwin进行替代,毕竟我只是使用Linux内核的部分命令就好。今天下午进行了实验,效果不错,从网上找到了这篇文章,做为cygwin的入门文章!写的不错,enjoy it!

原文如下:

By EnterBD[BCT]
QQ:4791821
E-Mail:Taynni@Gmail.com
欢迎转载和指出错误,但请保留以上信息,谢谢.

0:简介
1:下载和安装
2:使用

简介
Cygwin是一个运行于Windows下的免费的UNIX的子系统,使用一个Dll(动态链接库)来

实现,这样,我们可以开发出Cygwin下的UNIX工具,使用这个DLL运行在Windows下,大家可以想

一下,你在运行Windows的同时,也可以使用VI,BASH,TAR,SED等UNIX下的工具,不是很好吗?这个VM

虚拟机有很相同的原理,但是VM是虚拟多个,而Cygwin是同时使用Windows和UNIX,很爽吧,这样

对于那些在Windows和Unix下移植的程序来说是比较简单的事情了.

一:下载和安装

其下载安装程序在Http://www.cygwin.com,下载安装程序以后,运行,然后会要你选择是通过什么方

式进行下载安装所需要的文件,有三种方式,Http.Ftp.本地,我建议你首先通过Http和Ftp把安装所需要的

文件全部下回来以后选择本地安装比较好,在线安装比较慢,会是一个很长的等待,虽然所需要的文件

不大,但是全部安装的话会是4G大小,还是有选择性的安装吧,在安装界面,有Prev(老版本),Curr(当前版本)
Exp(最新版本测试版本),苹果这里建议你选择Curr,然后你单击View按钮,这样你可以在可以使用的安装

文件之间进行选择性的安装,如果你真的想全部安装的话,那么左键点击一下最上面的All,然后看到

INSTALL,这样选择了全部,进行全部安装便可以了,安装完以后,会在桌面产生一个图标,双击这个图标,

呵呵,你便可以使用Cygwin了.关于安装的具体参数方法,网络上有比较详细的介绍,我就不罗嗦了.

PS:下载方面我建议如下:你可以下载以下几个版本的Cygwin:

您现在可以使用Cygwin.cn的镜像,详情请参考[安装]

原始站:  http://sources.redhat.com/cygwin/;
印地安那大学的免安砚光盘cygwin, 叫做 XLiveCD: http://xlivecd.indiana.edu/ ,
USA, Indiana  ftp://ftp.ussg.indiana.edu/pub/xlivecd/xlivecd-20041201.iso
/usr/lib/gcc/x86_64-pc-cygwin/12/../../../../x86_64-pc-cygwin/bin/ld: output_executable.exe: in function `mainCRTStartup': /usr/src/debug/cygwin-3.6.1-1/winsup/cygwin/crt0.c:16: multiple definition of `mainCRTStartup'; /usr/lib/gcc/x86_64-pc-cygwin/12/../../../../lib/crt0.o:/usr/src/debug/cygwin-3.6.1-1/winsup/cygwin/crt0.c:16: first defined here /usr/lib/gcc/x86_64-pc-cygwin/12/../../../../x86_64-pc-cygwin/bin/ld: output_executable.exe: in function `mainCRTStartup': /usr/src/debug/cygwin-3.6.1-1/winsup/cygwin/crt0.c:16: multiple definition of `WinMainCRTStartup'; /usr/lib/gcc/x86_64-pc-cygwin/12/../../../../lib/crt0.o:/usr/src/debug/cygwin-3.6.1-1/winsup/cygwin/crt0.c:16: first defined here /usr/lib/gcc/x86_64-pc-cygwin/12/../../../../x86_64-pc-cygwin/bin/ld: output_executable.exe:cygming-crtbeg:(.text+0x50): multiple definition of `__gcc_register_frame'; /usr/lib/gcc/x86_64-pc-cygwin/12/crtbegin.o:cygming-crtbeg:(.text+0x0): first defined here /usr/lib/gcc/x86_64-pc-cygwin/12/../../../../x86_64-pc-cygwin/bin/ld: output_executable.exe:cygming-crtbeg:(.text+0x70): multiple definition of `__gcc_deregister_frame'; /usr/lib/gcc/x86_64-pc-cygwin/12/crtbegin.o:cygming-crtbeg:(.text+0x20): first defined here /usr/lib/gcc/x86_64-pc-cygwin/12/../../../../x86_64-pc-cygwin/bin/ld: output_executable.exe:cygming-crtbeg:(.data+0x0): multiple definition of `__dso_handle'; /usr/lib/gcc/x86_64-pc-cygwin/12/crtbegin.o:cygming-crtbeg:(.data+0x0): first defined here collect2: 错误:ld 返回 1
06-09
<think>我们正在解决Cygwin环境下链接器报错的问题,错误涉及多个定义(multipledefinition)和crt0.c文件冲突。具体错误信息包括`mainCRTStartup`,`WinMainCRTStartup`,`__gcc_register_frame`等符号的多重定义,以及`collect2:ldreturned1exitstatus`。根据引用[1]中的经验,当使用`gcca.o-oa.exe`时出现多重定义错误,而添加`-nostartfiles`选项可以解决。这是因为Cygwin环境下的GCC默认会链接系统的启动函数(如`mainCRTStartup`),这些启动函数已经在C运行时库(如`crt0.o`)中定义。如果我们编译的源文件(例如`a.c`)中包含了相同的启动函数定义,就会导致冲突。###🔍问题分析1.**多重定义错误来源**:CygwinGCC在链接时自动链接了标准启动文件(如`crt0.o`或`crt1.o`),这些文件包含程序入口点(如`mainCRTStartup`)。如果用户程序中也定义了这些符号(例如,用户试图自己实现启动函数),则会出现多重定义。2.**`-nostartfiles`的作用**:该选项告诉链接器不要使用标准系统启动文件,从而避免与用户定义的启动函数冲突。###⚙️解决方案####1.避免在用户代码中定义系统启动函数除非你有特殊需求(如编写操作系统内核或裸机程序),否则不要定义`mainCRTStartup`、`WinMainCRTStartup`等函数。标准的C程序应该从`main`函数开始。####2.使用正确的编译命令-**编译源文件直接生成可执行文件**(推荐):```bashgcca.c-oa.exe```这种方式不会出现多重定义问题,因为编译器会自动处理启动代码。-**先编译成目标文件,再链接**:如果必须分步编译,在链接步骤使用`-nostartfiles`:```bashgcc-ca.c-oa.o#编译成目标文件gcca.o-oa.exe-nostartfiles```注意:使用`-nostartfiles`意味着你需要自己提供程序入口点(例如,定义`_start`函数)。通常,标准C程序不需要这样做,除非是特殊环境。####3.检查代码中的入口点定义确保你的代码中没有定义以下函数(这些是系统启动函数):-`mainCRTStartup`-`WinMainCRTStartup`-`_start`标准C程序应该只有一个`main`函数。####4.确保没有链接多个启动文件Cygwin环境中,检查是否错误地链接了多个启动文件(如同时链接了`crt0.o`和`crt1.o`)。这通常发生在复杂的构建脚本中。使用以下命令查看链接的库和对象文件:```bashgcc-va.c-oa.exe```输出中会显示详细的链接过程,注意是否链接了多个启动文件。###💡错误示例分析根据引用[1]中的示例:```bashgcca.oa.o-oa.exe#错误:同一个目标文件链接两次```这会引发多重定义错误,因为同一个目标文件(`a.o`)被链接了两次,导致其中定义的每个符号都被重复定义。确保每个目标文件只链接一次。###⚠️注意事项使用`-nostartfiles`可能会导致程序运行时环境初始化不完整(例如,标准输入输出未初始化)。如果你只是编写普通用户程序,避免使用此选项,而是让链接器自动处理启动文件。###🔧调试技巧1.**查看符号定义**:使用`nm`工具检查目标文件和可执行文件中的符号:```bashnma.o#查看a.o中的符号nm/usr/lib/crt0.o#查看系统启动文件中的符号```如果你在`a.o`中看到`mainCRTStartup`等符号,说明你的代码中定义了这些符号,需要移除。2.**详细链接过程**:添加`-Wl,--verbose`选项查看链接器详细输出:```bashgcca.o-oa.exe-Wl,--verbose```###示例:标准C程序结构```c#include<stdio.h>intmain(){printf("Hello,Cygwin!\n");return0;}```编译命令:```bashgcchello.c-ohello.exe```§§相关问题§§1.Cygwin环境中如何自定义程序入口点?2.`-nostartfiles`和`-nostdlib`选项有何区别?3.如何为Cygwin编写裸机程序(不依赖标准库)?4.如何解决链接时出现的`__gcc_register_frame`多重定义错误?[^1]</think> 我将针对Cygwin环境下链接器报错问题提供结构化解决方案。此问题涉及多个符号(mainCRTStartup, WinMainCRTStartup等)的多重定义冲突,以及crt0启动文件相关错误。 ### 🔍 问题核心分析 在Cygwin环境下遇到的链接错误主要原因是**多重符号定义冲突**和**启动文件选择错误**: 1. **mainCRTStartup/WinMainCRTStartup冲突**: - CygwinGCC默认链接标准C启动文件(crt0.o或crt1.o),其中已定义程序入口点 - 用户代码中若包含同名的启动函数定义会导致多重定义错误 - 冲突函数包括:`mainCRTStartup`(控制台程序), `WinMainCRTStartup`(GUI程序)[^1] 2. **__gcc_register_frame冲突**: - 与异常处理框架相关,通常由重复链接libgcc导致 - 常见于混用不同编译器生成的目标文件时 3. **crt0.c相关错误**: - Cygwin环境使用特殊启动文件适配Windows环境 - 错误使用-nostartfiles/-nostdlib选项可能导致启动流程不完整 ### ⚙️ 分步解决方案 #### 方案1:使用标准编译流程(推荐) ```bash # 控制台应用程序(使用标准入口点) gcc main.c -o app.exe # GUI应用程序(使用WinMain入口) gcc main.c -o app.exe -mwindows ``` 此方案让链接器自动选择正确的启动文件,避免手动干预。 #### 方案2:正确使用入口点选项 当需要自定义入口点时: ```bash # 1. 首先正常编译目标文件(不加-nostartfiles) gcc -c main.c -o main.o # 2. 显式指定入口点链接(避免多重定义) gcc main.o -o app.exe -e my_entry_point -nostartfiles ``` 要点: - `-e`指定自定义入口点函数名 - `-nostartfiles`需与`-e`配合使用 - 在自定义入口点中需手动初始化CRT[^1] #### 方案3:解决__gcc_register_frame冲突 ```bash # 添加链接器选项解决异常处理冲突 gcc main.o -o app.exe -Wl,--disable-dynamicbase ``` #### 方案4:检查库链接顺序 调整库链接顺序可解决多数符号冲突: ```bash gcc main.o -o app.exe -lgcc -lcygwin -luser32 -lkernel32 ``` 遵循顺序:目标文件 → 语言支持库(libgcc) → 系统库 ### 💻 正确项目结构示例 ```makefile # Makefile示例 (Cygwin环境) TARGET = app.exe SRC = main.c $(TARGET): $(SRC) # 控制台程序使用标准编译 gcc $^ -o $@ # 若必须自定义入口点: # gcc -c $^ -o main.o # gcc main.o -o $@ -e my_entry -nostartfiles clean: rm -f *.o $(TARGET) ``` ### ⚠️ 关键注意事项 1. 避免在用户代码中定义`mainCRTStartup`等标准入口点 2. `-nostartfiles`会禁用所有标准启动代码,需手动完成: ```c // 自定义入口点示例 void _start() { // 1. 初始化堆栈 // 2. 初始化CRT extern void __main(void); __main(); // 初始化全局对象 // 3. 调用主函数 int ret = main(); // 4. 清理并退出 exit(ret); } ``` 3. Cygwin环境中`crt0.o`的特殊作用: - 处理Windows↔Unix环境转换 - 初始化cygwin运行时环境 - 设置异常处理框架 ### 🔧 高级调试技巧 1. 查看链接过程细节: ```bash gcc -v main.c -o app.exe ``` 2. 分析目标文件符号: ```bash nm main.o | grep 'mainCRTStartup\|WinMainCRTStartup' ``` 3. 检查默认链接脚本: ```bash ld --verbose | less ``` 4. 查看系统启动文件: ```bash ls /usr/lib/crt*.o ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值