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

转载请注明文章地址,尊重作者赖半仙的劳动成果,谢谢支持:
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函数的主文件放在编译命令的第二位(第一是定义输入文件名)那就不会出错了。
   或者是永远把库文件放在编译链接命令的最后。

转载于:https://blog.51cto.com/brantc/441293

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

  1. ffmpeg库编译加文字_使用ffmpeg库编译错误及解决办法

    一.FFmpeg源代码下载与编译 # wget http://www.ffmpeg.org/releases/ffmpeg-0.5.13.tar.bz2 # tar -jxvf ffmpeg-0.5. ...

  2. C/C++ 跨平台交叉编译、静态库/动态库编译、MinGW、Cygwin、CodeBlocks使用原理及链接参数选项

    0. 引言 UNIX是一个注册商标,是要满足一大堆条件并且支付可观费用才能够被授权使用的一个操作系统.linux是unix的克隆版本,是由其创始人Linus和诸多世界知名的黑客手工打造的一个操作系统. ...

  3. linux opencv编译静态库,使用openCV的静态库编译

    转载请注明出处: By 少侠阿朱 摘要: 本文主要讲述如何使用opencv静态库进行编译,生成脱离opencv环境可执行.exe文件. 实现的效果: 此方法生成的exe文件在其他没有配置openCV环 ...

  4. 静态链接库、动态链接库和动态加载库

    前言 静态库是obj文件的一个集合(目标文件中通常仅解析了文件内部的变量和函数,对于引用的函数和变量还没有解析,这需要将其他已经编写好的目标文件引用进来,将没有解析的函数和变量进行解析,通常引用的目标 ...

  5. FFmpeg示例程序合集-批量编译脚本

    此前做了一系列有关FFmpeg的示例程序,组成了< 最简单的FFmpeg示例程序合集>,其中包含了如下项目: simplest ffmpeg player:                 ...

  6. Unix/Linux下的Curses库开发指南——第三章curses库窗口

    第3 章 curses 库窗口 3 .1 curses 窗口简介 3.1.1窗口概念 窗口是 curses 库中最重要的一个组件,它实际上是屏幕上的一块矩形区域,在上面我们可以进行各种输出以及操作. ...

  7. Android直播开发之旅(4):MP3编码格式分析与lame库编译封装

    转载请声明出处:http://blog.csdn.net/andrexpert/article/77683776 一.Mp3编码格式分析 MP3,全称MPEG Audio Layer3,是一种高效的计 ...

  8. ffmpeg开发之旅(4):MP3编码格式分析与lame库编译封装

    ffmpeg开发之旅(4):MP3编码格式分析与lame库编译封装 原文链接:http://blog.csdn.net/andrexpert/article/77683776 一.Mp3编码格式分析 ...

  9. JAVA窗体程序调用图片、音频、字体资源

    简介 介绍JAVA窗体程序调用图片.音频.字体三种静态资源的代码.使用这种方法调用静态资源,可以直接把静态资源打包到JAR包里. 在音频调用中,可能会由于Eclipse的原因报错,解决办法参见有关im ...

最新文章

  1. python turtle画气球-micro:bit + LoRa 实现气球追踪
  2. jQuery Mobile 快速入门
  3. enterprise architect复制到word中的标签怎么改变_7个 Word 技巧,不会别说自己会 Word...
  4. 引用:初探Sql Server 执行计划及Sql查询优化
  5. C语言实现简单的内存管理机制
  6. python3能做什么_你都用 Python 来做什么?
  7. ajax jsonp img
  8. Python 可以满足你任何 API 使用需求
  9. 2017计算机湖北对口试题答案,2017年计算机专业对口考试试卷及答案
  10. mybaitis动态sql利用bind标签代替%拼接完成模糊查询
  11. mysql定制化_【MySQL技巧】定制你的MySQL命令行
  12. quartz spring 时间配置
  13. SecureCRT无法使用Zmodem上传下载文件
  14. 激活mircrosoft office2013
  15. mac 个人网站收藏(一)
  16. 读取第n行python_Python如何一次读取N行
  17. c语言中signal函数详细说明--举例
  18. TDengine与InfluxDB性能对比
  19. 健康保健--维多利亚宣言
  20. 面经汇总--校招--北京顺丰同城

热门文章

  1. mysql中的explain_mysql中的explain分析
  2. docker from指令的含义_volume_from指令-docker撰写
  3. java怎么延迟执行语句_Go语言defer(延迟执行语句)
  4. mui php上传图片,mui ajax图片上传
  5. mysql数据库导入操作_mysql 导入数据库 命令操作
  6. 抽象工厂模式_设计模式(3) 抽象工厂模式
  7. BOMTool更新到1.3.0.10
  8. 图灵奖颁给深度学习三巨头,他们曾是一小撮顽固的“蠢货”
  9. 你真的理解反向传播吗?面试必备
  10. 阿里AI两项技术刷新行业纪录,为城市大脑,OR也为无人车?