gcc编译器的使用
我在一个文件中定义了很多函数和全局变量,但是在main中我又没有全部使用,所以我不想在链接的时候把那些没有调用的函数和全局变量也链接进来。我该怎么办?应该怎样指定连接器???
希望高手指点
注:使用的编译器是gcc
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
![扫码二维码加入Web技术交流群](/public/img/jiaqun_03.jpg)
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
我在一个文件中定义了很多函数和全局变量,但是在main中我又没有全部使用,所以我不想在链接的时候把那些没有调用的函数和全局变量也链接进来。我该怎么办?应该怎样指定连接器???
希望高手指点
注:使用的编译器是gcc
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(9)
每个函数和全局变量各使用一个源文件.这样连接器在连接的时候,就不会连接不用的函数和变量.但实际上这样做是不明智的。
做成动态链接库如何?
回复 3# xianliang
能不能通过设置gcc的编译选项来实现呢?
本帖最后由 teclimber 于 2011-05-08 16:33 编辑
回复 2# cobras
这样做的话我的程序中就会有无数个文件了,所以这样做确实不明智。还有没有更好的方法?能不能让编译器自己去识别?
回复 4# teclimber
实现什么?动态链接库?可以吧。-shared如何?
本帖最后由 zhaohongjian000 于 2011-05-09 12:22 编辑
没用到的函数本来就不会链接,没用到的全局变量应该也能优化掉。
话说没用到你写什么?难道用的别人写的文件?
回复 7# zhaohongjian000
没有使用的全局变量怎么才能优化掉??怎样指定编译器??
我试了,在默认的情况下是优化不掉的。
下面是我的操作:文件名是test.c
int a[1024*1024]={1};
int main()
{
}
编译:gcc -o test test.c
生成的test 的大小是4205773 byte
--------------------------------------------
当把程序的全局变量注释掉后:
//int a[1024*1024]={1};
int main()
{
}
编译:gcc -o test test.c
生成的test 的大小是11419 byte
对于这个例子,你可以试试-O2。
不过你在顶楼说的不是这种情况。顶楼说的是在另一个文件中定义了,这个文件中没有使用。这个需要链接时才能确定是否可以优化,总之你试试吧,编译的时候开-O2,然后链接看看能不能优化掉,我也不是非常确定。
回复 7# zhaohongjian000
下面是我写的一段程序:文件名是test.c
void test()
{
int a;
}
int main()
{
}
编译:gcc -o test test.c
然后: objdump -d test
以下是反汇编的部分内容:
080482f4 <test>:
80482f4: 55 push %ebp
80482f5: 89 e5 mov %esp,%ebp
80482f7: 83 ec 04 sub $0x4,%esp
80482fa: c9 leave
80482fb: c3 ret
080482fc <main>:
80482fc: 55 push %ebp
80482fd: 89 e5 mov %esp,%ebp
80482ff: 83 ec 08 sub $0x8,%esp
8048302: 83 e4 f0 and $0xfffffff0,%esp
8048305: b8 00 00 00 00 mov $0x0,%eax
804830a: 29 c4 sub %eax,%esp
804830c: c9 leave
804830d: c3 ret
804830e: 90 nop
804830f: 90 nop
为什么test也在里面????我根本就没有在main里调用呀