文档章节

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

01010101010101010101
 01010101010101010101
发布于 2014/01/03 21:34
字数 1205
阅读 50
收藏 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
长宁
高级程序员
简单的JavaScript继承(译)

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

王兴欣
2017/10/16
0
0
GCC and C99 inline

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

长平狐
2012/09/03
108
0
Solidity的库(二十七)|入门系列

库与合约类型,但他们的目的是重用代码1。通过EVM中的特性来调用部署到某个位置的库代码,就实现了复用。 库函数运行的上下文 指令意味着,代码是在发起调用合约的context中被执行的,因此将...

区块链技术博客
2017/06/17
0
0
Scrapy 1.5.0之爬取规则

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

Eappo_Geng
06/26
0
0
.c和.h文件的区别

一个简单的问题:.c和.h文件的区别 学了几个月的C语言,反而觉得越来越不懂了。同样是子程序,可以定义在.c文件中,也可以定义在.h文件中,那这两个文件到底在用法上有什么区别呢? 2楼: 子...

晨曦之光
2012/03/09
560
0

没有更多内容

加载失败,请刷新页面

加载更多

区块链教程以太坊源码分析chain-indexer区块链索引一

兄弟连区块链教程以太坊源码分析chain-indexer区块链索引一 chain_indexer 区块链索引 chain_indexer.go 源码解析 chain_indexer 顾名思义, 就是用来给区块链创建索引的功能。 之前在eth协议...

兄弟连区块链入门教程
20分钟前
1
0
社会化分享插件集成分享

一.前提摘要 社会化分享每个app必备的推广需求,无论是拉新,邀请,游戏奖励,等等都离不开分享的影子,下面我们介绍下社会化分享的插件; 首先要说下,现在的社交App,社区App等,国内外的...

佳妮
20分钟前
1
0
IOC 之 Spring 统一资源加载策略

统一资源:Resource org.springframework.core.io.Resource 为 Spring 框架所有资源的抽象和访问接口 它继承 org.springframework.core.io.InputStreamSource接口 作为所有资源的统一抽象,S...

职业搬砖20年
21分钟前
1
0
Python爬虫实战入门一:工具准备

一、基础知识 使用Python编写爬虫,当然至少得了解Python基本的语法,了解: 基本数据结构 数据类型 控制流 函数的使用 模块的使用 不需要过多过深的Python知识,仅此而已。 个人推荐《Pytho...

糖宝lsh
25分钟前
1
0
Hanlp中使用纯JAVA实现CRF分词

Hanlp中使用纯JAVA实现CRF分词 与基于隐马尔可夫模型的最短路径分词、N-最短路径分词相比,基于条件随机场(CRF)的分词对未登录词有更好的支持。本文(HanLP)使用纯Java实现CRF模型的读取与...

左手的倒影
27分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部