[转]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,如需转载请自行联系原作者

目录
相关文章
|
3月前
|
前端开发 C语言
gcc动态库升级
gcc动态库升级
|
1月前
|
编译器 Linux C语言
gcc的编译过程
GCC(GNU Compiler Collection)的编译过程主要包括四个阶段:预处理、编译、汇编和链接。预处理展开宏定义,编译将代码转换为汇编语言,汇编生成目标文件,链接将目标文件与库文件合并成可执行文件。
60 11
|
3月前
|
编译器 开发工具 C语言
Gcc 链接文件
Gcc 链接文件
34 4
|
3月前
|
编译器 C语言 C++
MinGW安装gcc
MinGW安装gcc
89 0
|
6月前
|
编译器 Linux 开发工具
|
6月前
|
NoSQL 编译器 开发工具
006.gcc编译器
gcc是什么?
87 0
006.gcc编译器
|
6月前
|
存储 NoSQL 算法
从一个crash问题展开,探索gcc编译优化细节
问题分析的过程也正是技术成长之路,本文以一个gcc编译优化引发的crash为切入点,逐步展开对编译器优化细节的探索之路,在分析过程中打开了新世界的大门……
|
5月前
|
自然语言处理 编译器 Go
GCC:GNU编译器
GCC:GNU编译器
|
5月前
|
Java 编译器 Linux
技术经验解读:【转载】详解GCC的下载和安装(源码安装)
技术经验解读:【转载】详解GCC的下载和安装(源码安装)
161 0
|
5月前
|
C语言
关于如何解决mingw64安装后配置完环境变量仍然执行不了gcc命令
关于如何解决mingw64安装后配置完环境变量仍然执行不了gcc命令