gcc编译器的使用

发布于 2022-10-15 07:40:42 字数 126 浏览 23 评论 0

我在一个文件中定义了很多函数和全局变量,但是在main中我又没有全部使用,所以我不想在链接的时候把那些没有调用的函数和全局变量也链接进来。我该怎么办?应该怎样指定连接器???
希望高手指点

注:使用的编译器是gcc

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

忆离笙 2022-10-22 07:40:42

每个函数和全局变量各使用一个源文件.这样连接器在连接的时候,就不会连接不用的函数和变量.但实际上这样做是不明智的。

怪我入戏太深 2022-10-22 07:40:42

做成动态链接库如何?

简单气质女生网名 2022-10-22 07:40:42

回复 3# xianliang

    能不能通过设置gcc的编译选项来实现呢?

迷爱 2022-10-22 07:40:42

本帖最后由 teclimber 于 2011-05-08 16:33 编辑

回复 2# cobras

    这样做的话我的程序中就会有无数个文件了,所以这样做确实不明智。还有没有更好的方法?能不能让编译器自己去识别?

×纯※雪 2022-10-22 07:40:42

回复 4# teclimber

    实现什么?动态链接库?可以吧。-shared如何?

我很坚强 2022-10-22 07:40:42

本帖最后由 zhaohongjian000 于 2011-05-09 12:22 编辑

没用到的函数本来就不会链接,没用到的全局变量应该也能优化掉。

话说没用到你写什么?难道用的别人写的文件?

紫﹏色ふ单纯 2022-10-22 07:40:42

回复 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

末蓝 2022-10-22 07:40:42

回复  zhaohongjian000

    没有使用的全局变量怎么才能优化掉??怎样指定编译器??
我试了,在默 ...
teclimber 发表于 2011-05-09 12:56

    对于这个例子,你可以试试-O2。

不过你在顶楼说的不是这种情况。顶楼说的是在另一个文件中定义了,这个文件中没有使用。这个需要链接时才能确定是否可以优化,总之你试试吧,编译的时候开-O2,然后链接看看能不能优化掉,我也不是非常确定。

初见 2022-10-22 07:40:42

回复 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里调用呀

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文