g++做的静态库,连接时报错

AplusMartin 2011-06-25 11:36:48
做了一个测试的例子,但是老是报错,请高手帮着看看
fun.h
-----------
#include <stdio.h>
#include <stdlib.h>

class cfun
{
public:
cfun();
virtual ~cfun();

void funadd(int a, int b);
};
------------

fun.cpp
------------
#include <fun.h>

cfun::cfun()
{
}

cfun::~cfun()
{
}

void cfun::funadd(int a, int b)
{
printf("a + b = %d\n", a + b);
}
------------

t1.cpp
------------
#include <fun.h>

int main(int avg, char * cvg[])
{
cfun c1;
c1.funadd(1, 2);
return 0;
}
------------

我使用g++生成fun的库
g++ -c -I./ fun.cpp
ar rcs libfun.a fun.o
使用libfun.a时出错了
g++ -I./ -L./ -lfun t1.cpp -o t1
/tmp/ccGVwhPY.o: In function `main':
t1.cpp:(.text+0x19): undefined reference to `cfun::cfun()'
t1.cpp:(.text+0x34): undefined reference to `cfun::funadd(int, int)'
t1.cpp:(.text+0x44): undefined reference to `cfun::~cfun()'
t1.cpp:(.text+0x5a): undefined reference to `cfun::~cfun()'
collect2: ld 返回 1

但如果使用的
g++ -I./ t1.cpp ./libfun.a -o t1
就可以

问题:为什么我不能创建静态库的方法使用呢?
...全文
209 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
南京浪人甲 2011-06-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hqin6 的回复:]

g++ -I./ -L./ -lfun t1.cpp -o t1

将-lfun放到最后
因为gcc的编译器在做编译的时候,会从头到尾扫描符号表的。。。

具体可以参考:
http://blog.csdn.net/hqin6/archive/2010/06/27/5698228.aspx

结论:
1、应用程序在链接阶段时,会顺序生成符号表。也就是说,在……
[/Quote]

学习了!最近正在看《程序员的自我修养--链接、装载与库》,感觉挺好,推荐给楼主啊!
南京浪人甲 2011-06-25
  • 打赏
  • 举报
回复
要把库放在待编译文件后面。否则g++ -I./ ./libfun.a t1.cpp -o t1 照样不行哦
xunxun 2011-06-25
  • 打赏
  • 举报
回复
恩,我看错了…… 汗……
太乙 2011-06-25
  • 打赏
  • 举报
回复
-l参数会首先寻找动态库,如果没有动态库会去寻找静态库

在符号解析阶段,链接器从左到右的顺序来扫描可重定位目标文件和存档文件。可重定位目标文件的集合E,未解析的符号集合U,已定义的符号集合D,关于库的一般准则是将他们放在命令行的结尾。
太乙 2011-06-25
  • 打赏
  • 举报
回复
g++ -I./ -L./ -lfun t1.cpp -o t1

将-lfun放到最后
因为gcc的编译器在做编译的时候,会从头到尾扫描符号表的。。。

具体可以参考:
http://blog.csdn.net/hqin6/archive/2010/06/27/5698228.aspx

结论:
1、应用程序在链接阶段时,会顺序生成符号表。也就是说,在应用程序中涉及到的符号,会在链接文件中逐个顺次查找
2、一旦查找到符号,就停止本符号的查找工作,转向第二个符号的查找
3、如果没有用到.a里的符号,即查找的过程中没有涉及到该.a,则不会在程序中链接该.a
4、对于.so,无论是否涉及到符号查找,均会进行加载
5、so的加载和卸载会涉及到自身内存分配和释放,而.a不会(.a相当于.o的集合,.o直接静态编译到应用程序,成为程序一部分)
6、.a和.o有不同,.a是.o的集合,但是,.o必定会加载,.a不一定会加载(只加载符号表相关的.o)
justkk 2011-06-25
  • 打赏
  • 举报
回复
g++ -I./ t1.cpp -ot1 -L./ -lfun
xunxun 2011-06-25
  • 打赏
  • 举报
回复
-l只会搜索系统默认路径

64,677

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧