[转]gcc下程序调用静态库编译命令:主文件必须在静态库前面!-阿里云开发者社区

开发者社区> 像教授> 正文

[转]gcc下程序调用静态库编译命令:主文件必须在静态库前面!

简介:
+关注继续查看

很容易犯的错误,转载以备注!

 

转载请注明文章地址,尊重作者赖半仙的劳动成果,谢谢支持:
http://hi.baidu.com/mgqw/blog/item/0969c4230a2508559922edc3.html

    这几天在弄一个东西,相同的文件编译的动态库和静态库,调用动态库没有问题,调用静态库确报错:函数没有定义就引用(undefined reference to ***)。让我无比的郁闷,两个库文件一模一样都是相同的.o文件编译出来的,就是静态库调用的时候报错,而动态库完全正常,无比让人抓狂。
    埋头试了n久结果在一个不经意间发现了问题的所在,无比让人抓狂!!!!!

下面是一个简单的例子,有几个简单的程序文件:bill.c fred.c   lib.h   program.c(这个是主文件)

//bill.c

#include <stdio.h>

void bill(char *arg)
{
    printf("bill: you passed %s\n", arg);
}

 

//fred.c

#include <stdio.h>

void fred(int arg)
{
    printf("fred: you passed %d\n", arg);
}

 

//lib.h
void bill(char *);
void fred(int);

 

//program.c

#include "lib.h"

int main()
{
    bill("Hello Wold!\n");
    exit(0);
}

 

     总共四个文件,用gcc命令编译bill.c fred.c两个文件成动态库

 

$ gcc -c bill.c fred.c

 

$ ar -crv libfoo. bill.o fred.o

 

    然后编译program.c调用libfoo.a进行链接,看看俩个效果吧,先来正确的,注意program.c libfoo.a的位置:

 

$ gcc -o test

program.c libfoo.a

program.c: 在函数‘main’中:

 

program.c:6: 警告:隐式声明与内建函数‘exit’不兼容

 

   下面是链接报错的,其他都一样,只是mian函数文件和静态库文件位置调换了一下,立马报错:

 

]$ gcc -o test

libfoo.a program.c

program.c: 在函数‘main’中:

 

program.c:6: 警告:隐式声明与内建函数‘exit’不兼容

 

/tmp/cc88fWhl.o: In function `main':


program.c:(.text+0x19): undefined reference to `bill'

collect2: ld 返回 1

    这么一个小小的问题害我迷茫了两天,我靠,看来还是要养成好习惯: 
   永远把含有mian函数的主文件放在编译命令的第二位(第一是定义输入文件名)那就不会出错了。
   或者是永远把库文件放在编译链接命令的最后。






本文转自 xkdcc 51CTO博客,原文链接:http://blog.51cto.com/brantc/441293,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
C/C++封装库ocicpplib调用Oracle存储过程的方法
工作这么多年,一直使用Mysql, Oracle数据库没有接触过, 这次要使用C/C++语言来调用Oracle的存储过程, 懒得自己去看OCI的API了, 直接上网找别人封装的库, 最后发现了这个ocicpplib, 下载了看了一下, 还不错, 使用起来比较简单。
1067 0
OTL调用Oracle存储过程
OTL很早前用过,今天写东西要调存储过程,程序写完了,调试死活通不过,折腾了一早晨。 最后才发现错误,这里总结一下: 1、代码写的不规范。 有个参数后边少写了个“,”以至于总是抱错。而单独写的测试例子就没问题,后来一步一步跟踪了后才发现。
1364 0
编译skia静态库时,图片解码库无法注册的问题
转载:http://www.cnblogs.com/imlucky/archive/2012/08/01/2617851.html 今天编译skia库,增加图片解码库时总是无效。
803 0
Linux的nm查看动态和静态库中的符号
功能 列出.o .a .so中的符号信息,包括诸如符号的值,符号类型及符号名称等。所谓符号,通常指定义出的函数,全局变量等等。   使用 nm [option(s)] [file(s)] 有用的options: -A 在每个符号信息的前面打印所在对象文件名称; -C 输出demang...
2131 0
IDA反汇编/反编译静态分析iOS模拟器程序(二)加载文件与保存数据库
启动windows版的IDA,在Quickstart界面点击New,弹出一个对话框选择文件。也可以按取消后再把文件拖进IDA。由于Mac版的IDA没注册,没有save功能,所以只好先把Mac上的东西拷贝到windows再打开了。
1055 0
+关注
1338
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《Nacos架构&原理》
立即下载
《看见新力量:二》电子书
立即下载
云上自动化运维(CloudOps)白皮书
立即下载