+ -
当前位置:首页 → 问答吧 → gcc静态库链接

gcc静态库链接

时间:2010-08-12

来源:互联网

环境:ubuntu

编译出现的问题:用GCC编译找不到 printf等常用函数(stdio.h中声明的)

abc.c.text+0x1b4): undefined reference to `printf'

曾尝试指定 /usr/lib/libc.a,这回printf不包错了,但出现如下错误:

/usr/lib/libc.a(iofwrite.o): In function `fwrite':
(.text+0x144): undefined reference to `_Unwind_Resume'

这到底是怎么回事?按正常来说是不用指定 /usr/lib/libc.a(系统默认链接的).........

作者: kallytin   发布时间: 2010-08-12

回复 kallytin


    先顶一下

作者: kallytin   发布时间: 2010-08-12

回复 kallytin


    有人知道吗?

作者: kallytin   发布时间: 2010-08-12

贴代码吧。不然看不出问题。

作者: zzyong08   发布时间: 2010-08-12

/lib/libc-*.so被删了吧

作者: zhangsuozhu   发布时间: 2010-08-12

本帖最后由 zhangsuozhu 于 2010-08-12 13:00 编辑


QUOTE:
外部库有两种:
(1)静态连接库libc.a
(2)共享连接库libc.so
两者的共同点:
.a, .so都是.o目标文件的集合,这些目标文件中含有一些函数的定义(机器码),而这些函数将在连接时会被最终的可执行文件用到。
两者的区别:

态库.a : 当程序与静态库连接时,库中目标文件所含的所有将被程序使用的函数的机器码被copy到最终的可执行文件中. 静态库有个缺点:
占用磁盘和内存空间. 静态库会被添加到和它连接的每个程序中, 而且这些程序运行时, 都会被加载到内存中. 无形中又多消耗了更多的内存空间.

享库.so : 与共享库连接的可执行文件只包含它需要的函数的引用表,而不是所有的函数代码,只有在程序执行时,
那些需要的函数代码才被拷贝到内存中, 这样就使可执行文件比较小,




编译时要联静态库要加 -static 参数
  1. gcc  test.c
  2. ls -l a.out
  3. -rwxr-xr-x 1 alanx alanx 7057 2010-08-12 12:57 a.out
  4. gcc -static test.c
  5. ls -l a.out
  6. -rwxr-xr-x 1 alanx alanx 495437 2010-08-12 12:58 a.out
复制代码

作者: zhangsuozhu   发布时间: 2010-08-12

本帖最后由 ecjtubaowp 于 2010-08-12 13:03 编辑

printf,你用的应该是动态库的方式吧,在/lib目录下有libc-*.so的。

作者: ecjtubaowp   发布时间: 2010-08-12



QUOTE:
/lib/libc-*.so被删了吧
zhangsuozhu 发表于 2010-08-12 12:51



楼上,能说详细点吗? (我在/lib里只找到一个libc-2.8.90.so)

作者: kallytin   发布时间: 2010-08-12