去除 Cygwin 编译的程序对Cygwin1.dll的依赖

http://hi.baidu.com/%B6%AC%D2%E2%BE%D3/blog/item/7f1c1301135ae009728da510.html

 

用以下命令:
retsuff: lex.o retsuff.o main.o name.o
$(CC) -o ./retsuff name.o retsuff.o lex.o main.o
生成的一个 retsuff.exe 在 Cygwin 下用 ./retsuff 命令可以执行
但是在 Windows 的文件夹里直接双击 retsuff.exe 文件,却提示找不到 Cygwin1.dll
之所以会这样,是因为在 cygwin/gcc 下编译出来的程序,在 windows 中执行必须依赖 cygwin1.dll

解决方案1:
把 Cygwind1.ll放在 retsuff.exe 文件所在目录下就可以运行了,但是这样程序就无可移植性而言。

解决方案2:
把 cygwin1.dll 从 cygwin 安装文件夹的 bin 文件夹下拷出来,粘贴到 \windows\system32 文件夹下,但这样仍然不具移植性。

解决方案3:
在 gcc Makefile 的编译选项中加入 -mno-cygwin 参数。例如:
“$(CC) -o” 替换成 “$(CC) -mno-cygwin -o”
“$(CC) -ggdb -O2 -c” 替换成 “$(CC) -mno-cygwin -ggdb -O2 -c”
注意,-o 和 -c 都要添加该参数才能去除对 Cygwin1.dll 的依赖。


GCC参数介绍:
gcc将 C 文件编译到一个目标文件

-mno-cygwin 表示不从 Cygwin 环境生成代码
-Wall 输出所有的警告信息
-g 表示包含调试信息
-ggdb 表示包含调试信息(与 -g 的不同?见下文)
-O0 缺省选项,不进行任何优化,通常用在源程序调试阶段。
-O 对程序编译进行优化,编译器开支较小,优化强度较弱
-O2 允许比-O更好的优化,开支较大,是生成 Release 版本的最佳选择。
-O3 在 -O2 的基础上增加了内联函数,编译开支最大,也可能增加目标代码长度。
-Os 关闭所有Alignment 的优化选项,从而缩小执行文件体积,特别适用于对程
        序体积严格要求的嵌入式系统,对于某些较小的程序,该选项的效果甚至强于 -O2.
-Idir 将dir目录添加到搜寻头文件的目录列表中去,并优于gcc的搜索目录。
-static 禁止预共享函数库连接
-shared 尽量与共享函数库连接,这是缺省选项
-I 指出 DB2 include 头文件的路径
-c 只预处理、编译和汇编源程序,不进行连接

%1.c 是生成的 C 文件的名字
%1.o 是编译的目标文件的名字

gcc 的 -g 和 -ggdb 选项的区别:
        -g 和 -ggdb 都是令 gcc 生成调试信息,但是它们也是有区别的
        -g
        该选项可以利用操作系统的“原生格式(native format)”生成调试
        信息。GDB 可以直接利用这个信息,其它调试器也可以使用这个调试信息
        -ggdb
        使 GCC 为 GDB 生成专用的更为丰富的调试信息,但是,此时就不能用其
        他的调试器来进行调试了 (如 ddx)
        -g 和 -ggdb 也是分级别的
        -g2
        这是默认的级别,此时产生的调试信息包括扩展的符号表、行号、局部
        或外部变量信息。
        -g3
        包含级别2中的所有调试信息,以及源代码中定义的宏
        -g1
        级别1(-g1)不包含局部变量和与行号有关的调试信息,因此只能够用于回溯
        跟踪和堆栈转储之用。回溯跟踪指的是监视程序在运行过程中的函数调用历
        史,堆栈转储则是一种以原始的十六进制格式保存程序执行环境的方法,两者
        都是经常用到的调试手段。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值