文档章节

关于静太库中多个同名函数调用的例子

01010101010101010101
 01010101010101010101
发布于 2014/01/03 21:34
字数 1205
阅读 58
收藏 0

###################################################################################
###################################################################################
为了对以下几个问题进行分析:
        1:对静态库中的多个同名函数是否可以存在?
        2:如存在在调用时会如何调用(顺序??)?
        3:如库函数与不是打包在在库中的源代源中同时存在(如在main函数所在的文件里)又是如何调用?

 

+++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++

1:问题1与问题2用的源码如下。问题3只是对main.c进行一个同名函数的增加(请看下文)


[mengfh@red244 tt2]$ cat *.c
main.c

#include "head.h"
#include <stdio.h>

int main()
{
        fprintf(stderr,"this is main.c \n");
        display();

        return 0;
}


t1.c

#include<stdio.h>

void display()
{
        fprintf(stderr,"this is t1.c\n");
}


t2.c

#include<stdio.h>
void display()
{
        fprintf(stderr,"this is t2.c update display() function\n");

}

----------------------------------------------------------------------------------
[mengfh@red244 tt2]$ clear

[mengfh@red244 tt2]$ ls
head.h  t1.c  t1.o  t2.c
[mengfh@red244 tt2]$ cc -c *.c
[mengfh@red244 tt2]$ ls
head.h  t1.c  t1.o  t2.c  t2.o
[mengfh@red244 tt2]$ ll
×üó?á? 20
-rw-rw-r--    1 mengfh   mengfh         60  1??  9 07:58 head.h
-rw-rw-r--    1 mengfh   mengfh         73  1??  9 07:55 t1.c
-rw-rw-r--    1 mengfh   mengfh        832  1??  9 07:59 t1.o
-rw-rw-r--    1 mengfh   mengfh        100  1??  9 07:59 t2.c
-rw-rw-r--    1 mengfh   mengfh        868  1??  9 07:59 t2.o
[mengfh@red244 tt2]$ ar -curv libtt.a t1.o
a - t1.o===================================================================先增加t1.o
[mengfh@red244 tt2]$ ls
head.h  libtt.a  t1.c  t1.o  t2.c  t2.o
[mengfh@red244 tt2]$ cat >main.c
#include "head.h"
#include <stdio.h>

int main()
{
        fprintf(stderr,"this is main.c \n");
        display();

        return 0;
}
í?3?
[mengfh@red244 tt2]$ ls
head.h  libtt.a  main.c  t1.c  t1.o  t2.c  t2.o
[mengfh@red244 tt2]$ cc -o main main.c
/tmp/ccCAHz6s.o(.text+0x27): In function `main':
: undefined reference to `display'
collect2: ld returned 1 exit status
[mengfh@red244 tt2]$ cc -o main main.c -ltt
/usr/bin/ld: cannot find -ltt
collect2: ld returned 1 exit status
[mengfh@red244 tt2]$ cc -o main main.c -ltt -L.
[mengfh@red244 tt2]$ ls
head.h  libtt.a  main  main.c  t1.c  t1.o  t2.c  t2.o
[mengfh@red244 tt2]$ ./main
this is main.c
this is t1.c
[mengfh@red244 tt2]$ ar -curv libtt.a t2.o
a - t2.o================================================================再增加t2.o======>>>同一库文件里可以增加多个同名的函数在不同的模块中
[mengfh@red244 tt2]$ ls
head.h  libtt.a  main  main.c  t1.c  t1.o  t2.c  t2.o
[mengfh@red244 tt2]$ cc -o main main.c -ltt -L.
[mengfh@red244 tt2]$ ./main
this is main.c
this is t1.c

============================在libtt.a中加入了二个同名函数void display(),但是在进行编译时,其按顺序在静态库中查找
[mengfh@red244 tt2]$ cat t1.c t2.c
#include<stdio.h>

void display()
{
        fprintf(stderr,"this is t1.c\n");
}
#include<stdio.h>
void display()
{
        fprintf(stderr,"this is t2.c update display() function\n");

}
[mengfh@red244 tt2]$
[mengfh@red244 tt2]$
[mengfh@red244 tt2]$ rm main
[mengfh@red244 tt2]$ cc -o main main.c -ltt -L.
[mengfh@red244 tt2]$ ./main
this is main.c
this is t1.c
[mengfh@red244 tt2]$ ar -t *.a
t1.o
t2.o
[mengfh@red244 tt2]$ cat main.c
#include "head.h"
#include <stdio.h>

int main()
{
        fprintf(stderr,"this is main.c \n");
        display();

        return 0;
}
[mengfh@red244 tt2]$ ./main
this is main.c
this is t1.c


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2:于是我经过一阵的分析,
m:该操作是在一个库中移动成员。当库中如果有若干模块有相同的符号定义(如函数定义),则成员的位置顺序很重要。如果没有指定任选项,任何指定的成员将移到库的最后。也可以使用'a','b',或'I'任选项移动到指定的位置。

进行如下的编译:


[mengfh@red244 tt2]$ ls
head.h  head.hbak  libtt.a  mai2  main  main.c  t1.c  t1.o  t2.c  t2.o
[mengfh@red244 tt2]$ ar -t *.a
t1.o
[mengfh@red244 tt2]$ cc -o main main.c  -ltt -L.
[mengfh@red244 tt2]$ ./main
this is main.c
this is t1.c
[mengfh@red244 tt2]$ ar -b libtt.a t2.o
ar: no operation specified
[mengfh@red244 tt2]$ ar -b  t1.so libtt.a t2.o
ar: no operation specified
[mengfh@red244 tt2]$ ar -bcvru t1.so libtt.a t2.o
a - t2.o
---------------------------------本是想写成ar -bcvru t1.o libtt.a t2.o======》即将t2.o加入到t1.o前,但是没有找到t1.so于是就是加在尾部了。
[mengfh@red244 tt2]$ ls
head.h  head.hbak  libtt.a  mai2  main  main.c  t1.c  t1.o  t2.c  t2.o
[mengfh@red244 tt2]$ ar -t *.a
t1.o
t2.o
[mengfh@red244 tt2]$ cc -o main main.c -ltt -L.
[mengfh@red244 tt2]$ ./main
this is main.c
this is t1.c

-----------------------------于是为完成ar -bcvru t1.o libtt.a t2.o(因为在前面造成了书写错误,于是手动进行更改模块顺序)
[mengfh@red244 tt2]$ ar -mb t1.o libtt.a t2.o
[mengfh@red244 tt2]$ ar -t *.a
t2.o
t1.o
[mengfh@red244 tt2]$ cc -o main  main .c -ltt -L.
cc: .c: ??óD???????t?ò????
[mengfh@red244 tt2]$ cc -o main  main.c -ltt -L.
[mengfh@red244 tt2]$ ./main
this is main.c
this is t2.c update display() function
[mengfh@red244 tt2]$

 

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

3:于是我在main函数里又写了一个同名函数。
[mengfh@red244 tt2]$ ls
head.h  head.hbak  libtt.a  mai2  main  main.c  t1.c  t1.o  t2.c  t2.o
[mengfh@red244 tt2]$ vi main.c

#include "head.h"
#include <stdio.h>

void display();
int main()
{
        fprintf(stderr,"this is main.c \n");
        display();

        return 0;
}


void display()
{


        fprintf(stderr,"-------------------------in main\n");
}


"main.c" [ÒÑת»»] 20L, 231C ÒÑдÈë                                                                                 
[mengfh@red244 tt2]$ cc -o main  main.c -ltt -L.
[mengfh@red244 tt2]$ ./main
this is main.c
-------------------------in main
[mengfh@red244 tt2]$

 

=============================================================
得出结果:
        1:一个库文件里可以有多个同名函数。
        2:编译时在库文件中搜索函数时,与函数在库文件中的位置有关(模块之间的位置)
        3:非库文件中的函数优先与库文件被搜索,优先被调用。

 

© 著作权归作者所有

共有 人打赏支持
01010101010101010101
粉丝 23
博文 93
码字总数 68915
作品 0
长宁
高级程序员
私信 提问
关于Java类和对象,你想知道的在这里!

java类的基本组成 java作为一门面向对象的语言, 类和对象是最重要的概念之一,下面,就让我们来看看java中类的基本结构是怎样的: 一个简单的java类主要可由以下几个部分(要素)组成: 1....

Java-老刘
2018/06/08
0
0
Python 程序员经常犯的 10 个错误

关于Python Python是一种解释性的,面向对象的动态语义高级编程语言。其高层次的内置数据结构,结合动态类型和动态捆绑,及用作脚本或胶水语言来连接现有的组件或服务,使其在快速应用程序开发...

oschina
2014/05/09
19.8K
28
Scrapy 1.5.0之爬取规则

Spiders参数 spiders可以通过接收参数来修改其爬取行为。crawl 通过使用选项 -a 传递爬虫参数。 spiders 在构造函数中接收参数: 也可以通过Scrapyd API传递spiders参数。 Generic Spiders(...

Eappo_Geng
2018/06/26
0
0
GCC and C99 inline

C语言的inline 转以前我用Docbook写的一篇关于C语言inline关键字使用的文章。唉,要是能用docbook直接写Blog就好了。用得越多发现Docbook这个东西真是越好用啊~~ 本文介绍了GCC和C99标准中...

长平狐
2012/09/03
118
0
简单的JavaScript继承(译)

这篇文章翻译自John Resig(jQuery的作者)的博客,原文地址。 为了正在写的这本书(译者注:这本书是《忍者秘籍》),我最近做了许多关于JavaScript继承的工作,并在此基础上研究了几种不同...

王兴欣
2018/10/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java springcloud B2B2C o2o多用户商城 springcloud架构-docker-feign配置(五)

简介 上一节我们讨论了怎么用feign声明式调用cloud的生产者,这节我们讨论一下feign配置,通过编写配置类,我们可以自定义feign的日志级别,日志扫描目录,可以通过feign调用服务在eureka上的...

sccspuercode
27分钟前
2
0
长连接的心跳及重连设计

前言 说道“心跳”这个词大家都不陌生,当然不是指男女之间的心跳,而是和长连接相关的。 顾名思义就是证明是否还活着的依据。 什么场景下需要心跳呢? 目前我们接触到的大多是一些基于长连接...

crossoverJie
28分钟前
3
0
OSChina 周三乱弹 —— 风扇写着先生请自爱

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @蚂蚁哈哈哈 :分享陈奕迅的单曲《落花流水》 《落花流水》- 陈奕迅 手机党少年们想听歌,请使劲儿戳(这里) @车谷 :我发现每天上班都好困 ...

小小编辑
今天
901
13
centos7重置密码、单用户模式、救援模式、ls命令、chmod命令

在工作当中如果我们错误的配置了文件使服务器不能正常启动或者忘记密码不能登录系统,如何解决这些问题呢?重装系统是可以实现的,但是往往不能轻易重装系统的,下面用忘记密码作为例子讲解如...

李超小牛子
今天
4
0
Python如何开发桌面应用程序?Python基础教程,第十三讲,图形界面

当使用桌面应用程序的时候,有没有那么一瞬间,想学习一下桌面应用程序开发?行业内专业的桌面应用程序开发一般是C++,C#来做,Java开发的也有,但是比较少。本节课会介绍Python的GUI(图形用...

程序员补给栈
今天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部