文档章节

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

01010101010101010101
 01010101010101010101
发布于 2014/01/03 21:34
字数 1205
阅读 46
收藏 0
点赞 0
评论 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
.c和.h文件的区别

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

晨曦之光
2012/03/09
560
0
GCC and C99 inline

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

长平狐
2012/09/03
108
0
关于Java类和对象,你想知道的在这里!

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

Java-老刘
06/08
0
0
.c和.h文件的区别(头文件与之实现文件的的关系~ )

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

bigSoul
2017/11/05
0
0
关于Linux静态库和动态库的分析

1.什么是库 在windows平台和linux平台下都大量存在着库。 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。 由于windows和linux的本质不同,因此二者库的二进制是不...

YACHE
2011/07/04
0
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
NDK开发---C++学习(六):继承、多态

前言 前面我们已经介绍过了C++中的类与函数,不熟悉的,可以去看看 NDK开发---C++学习(三):类与函数(上) NDK开发---C++学习(四):类与函数(中) NDK开发---C++学习(五):类与函数(...

浮生若梦zp
2017/11/27
0
0
Python函数式编程指南(四):生成器

生成器是迭代器,同时也并不仅仅是迭代器,不过迭代器之外的用途实在是不多,所以我们可以大声地说:生成器提供了非常方便的自定义迭代器的途径。 这是函数式编程指南的最后一篇,似乎拖了一...

fjie
2013/10/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

python3.6用的外库遇到的问题

要用到wmi库 pip install wmi 装后不能用还要安装pywin32库。 要用到crypto加密模块安装pip instal pycrypto装后不能用。要安装pycryptodome。...

oisan_
14分钟前
0
0
select, poll, epoll I/O复用介绍

什么是I/O复用? 内核监视多个文件描述符(I/O文件句柄),一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知应用程序进行相应的读写操作。 I/O多路复用又被称为“事件驱动”(比如读写事...

xiaoxlm
15分钟前
0
0
【Spring 系列 给IOC容器添加组件的几种方式总结】

给Spring 注册Bean的几种方式总结。其中使用@Import注解是Spring Boot 完成自动配置的一个核心注解。 1、Spring 中给IOC容器添加组件的几种方式 在Spring的配置文件中,配置Bean(基于XML方式...

HansonReal
16分钟前
4
0
bootstrapTable语言包设置

###方法一引入不同的语言包 <script src="bootstrap-table-zh-CN.js"></script> ###方法二引入全语言包 <script src="bootstrap-table-locale-all.min.js"></script>//然后在初始化前设计默......

momo1987
16分钟前
0
0
Saltstack 常用命令

1、拷贝文件到客户端 # salt 'slaver.test.com' cp.get_file salt://apache.sls /tmp/cp.txt 2、拷贝目录到客户端 # salt 'slaver.test.com' cp.get_dir salt://test /tmp 3、显示存活的客户......

硅谷课堂
17分钟前
0
0
致初学者-如何学好Python这门编程语言?[图]

致初学者-如何学好Python这门编程语言?[图]: 对于很多Python3初学者,往往会面临以下问题:Python2和Python3我该学习哪一个?是否要安装Linux系统学习Python?Python3有各种版本我该安装哪...

原创小博客
20分钟前
1
0
E31---setopt=protected_multilib=false

今天在云服务器上装nginx,需要先安装一些依赖库比如zlib, ,但是安装zlib时候报错。 yum install -y zlib zlib-devel 1 (-y 指的是如果需要选yes no的自动y)下面是报错 Protected multil...

侠客行之石头
24分钟前
0
0
HTTP常见面试题

Http与Https的区别: HTTP 的URL 以http:// 开头,而HTTPS 的URL 以https:// 开头 HTTP 是不安全的,而 HTTPS 是安全的 HTTP 标准端口是80 ,而 HTTPS 的标准端口是443 在OSI 网络模型中,H...

JK_OPERA
25分钟前
0
0
python爬取站长素材网页图片保存到ppt中

网站地址:http://sc.chinaz.com/tupian/index.html 直接上代码: import requestsfrom bs4 import BeautifulSoupfrom pptx import Presentationfrom pptx.util import Inchesimpor......

你为什么不吃药
27分钟前
1
0
Ubuntu 18.04 swap空间的修改

一、准备工作 执行“sudo swapon -s”命令,查看是否已经存在swap file 二、修改swap file # 如果第一步存在swapfile则需要先禁用sudo swapoff /swapfile# 修改swap 空间的大小为2Gs...

Iceberg_XTY
30分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部