Linux下文件的类型是不依赖于其后缀名的,但一般来讲:

.o,是目标文件,相当于windows中的.obj文件

.so 为共享库,是shared object,用于动态连接的,和dll差不多

.a为静态库,是好多个.o合在一起,用于静态连接

.la为libtool自动生成的一些共享库,vi编辑查看,主要记录了一些配置信息。可以用如下命令查看.la文件的格式 $file .la

.la: ASCII English text

所以可以用vi来查看其内容。

创建.a库文件和.o库文件:

[yufei@localhost perl_c2]$ pwd

/home/yufei/perl_c2

[yufei@localhost perl_c2]$ cat mylib.c

#include

#include

void hello(){

printf("success call from perl to c library\n");

}

[yufei@localhost perl_c2]$ cat mylib.h

extern void hello();

[yufei@localhost perl_c2]$ gcc -c mylib.c

[yufei@localhost perl_c2]$ dir

mylib.c mylib.h mylib.o

[yufei@localhost perl_c2]$ ar -r mylib.a mylib.o

ar: 正在创建 mylib.a

[yufei@localhost perl_c2]$ dir

mylib.a mylib.c mylib.h mylib.o

动态链接库.so的编译与使用- -

动态库.so在Linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链接,总算搞懂了这个之前一直不太了解得东东,这里做个笔记,也为其它正为动态库链接库而苦恼的兄弟们提供一点帮助。

1、动态库的编译

下面通过一个例子来介绍如何生成一个动态库。这里有一个头文件:so_test.h,三个.c文件:test_a.c、test_b.c、test_c.c,我们将这几个文件编译成一个动态库:libtest.so。

so_test.h:

#include

#include

void test_a();

void test_b();

void test_c();

test_a.c:

#include "so_test.h"

void test_a()

{

printf("this is in test_a...\n");

}

test_b.c:

#include "so_test.h"

void test_b()

{

printf("this is in test_b...\n");

}

test_c.c:

#include "so_test.h"

void test_c()

{

printf("this is in test_c...\n");

}

将这几个文件编译成一个动态库:libtest.so

$ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so

2、动态库的链接

在1、中,我们已经成功生成了一个自己的动态链接库libtest.so,下面我们通过一个程序来调用这个库里的函数。程序的源文件为:test.c。

test.c:

#include "so_test.h"

int main()

{

test_a();

test_b();

test_c();

return 0;

}

l 将test.c与动态库libtest.so链接生成执行文件test:

$ gcc test.c -L. -ltest -o test

l 测试是否动态连接,如果列出libtest.so,那么应该是连接正常了

$ ldd test

l 执行test,可以看到它是如何调用动态库中的函数的。

3、编译参数解析

最主要的是GCC命令行的一个选项:

-shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件

-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。

-L.:表示要连接的库在当前目录中

-ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称

LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。

当然如果有root权限的话,可以修改/etc/ld.so.conf文件,然后调用 /sbin/ldconfig来达到同样的目的,不过如果没有root权限,那么只能采用输出LD_LIBRARY_PATH的方法了。

4、注意

调用动态库的时候有几个问题会经常碰到,有时,明明已经将库的头文件所在目录 通过 “-I” include进来了,库所在文件通过“-L”参数引导,并指定了“-l”的库名,但通过ldd命令察看时,就是死活找不到你指定链接的so文件,这时你要作的就是通过修改LD_LIBRARY_PATH或者/etc/ld.so.conf文件来指定动态库的目录。通常这样做就可以解决库无法链接的问题了。

makefile里面怎么正确的编译和连接生成.so库文件,然后又是在其他程序的makefile里面如何编译和连接才能调用这个库文件的函数????

答:

你需要告诉动态链接器、加载器ld.so在哪里才能找到这个共享库,可以设置环境变量把库的路径添加到库目录/lib和/usr/lib,LD_LIBRARY_PATH=$(pwd),这种方法采用命令行方法不太方便,一种替代方法

注释

LD_LIBRARY_PATH可以在/etc/profile还是 ~/.profile还是 ./bash_profile里设置,或者.bashrc里,

改完后运行source /etc/profile或 . /etc/profile

更好的办法是添入/etc/ld.so.conf, 然后执行 /sbin/ldconfig

注释

是把库路径添加到/etc/ld.so.conf,然后以root身份运行ldconfig

也可以在连接的时候指定文件路径和名称 -I -L.

GCC=gcc

CFLAGS=-Wall -ggdb -fPIC

#CFLAGS=

all: libfunc test

libfunc:func.o func1.o

$(GCC) -shared -Wl,-soname,libfunc.so.1 -o libfunc.so.1.1 $<

ln -sf libfunc.so.1.1 libfunc.so.1

ln -sf libfunc.so.1 libfunc.so

注释

ln -s是用来创建软链接,也就相当于windows中的快捷方式,在当前目录中创建上一级目录中的文件ttt的命名为ttt2软链接的命令是ln -s ../ttt ttt2,如果原文件也就是ttt文件删除的话,ttt2也变成了空文件。

ln -d是用来创建硬链接,也就相当于windows中文件的副本,当原文件删除的时候,并不影响“副本”的内容。

编译目标文件时使用gcc的-fPIC选项,产生与位置无关的代码并能被加载到任何地址:

gcc –fPIC –g –c liberr.c –o liberr.o

使用gcc的-shared和-soname选项;

使用gcc的-Wl选项把参数传递给连接器ld;

使用gcc的-l选项显示的连接C库,以保证可以得到所需的启动(startup)代码,从而避免程序在使用不同的,可能不兼容版本的C库的系统上不能启动执行。

gcc –g –shared –Wl,-soname,liberr.so –o liberr.so.1.0.0 liberr.o –lc

建立相应的符号连接:

ln –s liberr.so.1.0.0 liberr.so.1;

ln –s liberr.so.1.0.0 liberr.so;

在MAKEFILE中:

$@

表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,"$@"就是匹配于目标中模式定义的集合。

$%

仅当目标是函数库文件中,表示规则中的目标成员名。例如,如果一个目标是"foo.a(bar.o)",那么,"$%"就是"bar.o","$@"就是"foo.a"。如果目标不是函数库文件(Unix下是[.a],Windows下是[.lib]),那么,其值为空。

$<

依赖目标中的第一个目标名字。如果依赖目标是以模式(即"%")定义的,那么"$

$?

所有比目标新的依赖目标的集合。以空格分隔。

$

所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的,那个这个变量会去除重复的依赖目标,只保留一份。

注释

test: test.o libfunc

$(GCC) -o test test.o -L. -lfunc

%.o:%.c

$(GCC) -c $(CFLAGS) -o $@ $<

clean:

rm -fr .o

rm -fr .so

rm -fr test

要生成.so文件,cc要带-shared 参数;要调用.so的文件,比如libfunc.so,可以在cc命令最后加上-lfunc,还要视情况加上-L/usr/xxx 指出libfunc.so的路径;这样,在你要编译的源文件中就可以调用libfunc.so这个库文件的函数.

前面的都说的差不多了,最后提醒一下最好提供一个接口头文件

动态加载,用dlopen,dlclose,dlsym来

linux下目标文件的类型6,Linux下文件类型相关推荐

  1. Oracle Enterprise Manager Cloud Control 13c部署文档(二)——LINUX添加目标代理

    在EMCC13c中部署agent的方法分两种,一种是通过EMCC13c的控制台通过ssh直接把agent"推送"安装到被管理端.这样的方法在linux平台的OMS和被管理端比较简单 ...

  2. Linux中光盘使用的文件类型,linux下mount命令使用详解---linux挂载光盘等文件系统...

    mount 命令详解 功能:加载指定的文件系统. 语法:mount [-afFhnrvVw] [-L标签] [-o选项] [-t文件系统类型] [设备名] [加载点] 用法说明:mount可将指定设备 ...

  3. linux查看文件元数据,Linux切换目录、查看目录下的文件、文件类型介绍和查看文件的元数据信息...

    本篇博客介绍几个Linux的基础命令:写的如有不足,还望读者不吝赐教! 切换目录 cd(ChangeDirectory)切换工作目录 语法:cd  [要切换的目录] cd:进入用户的宿主目录(回家) ...

  4. linux 中如何将文件粘贴到usr下的lib内,学会在Linux下GCC生成和使用静态库和动态库...

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

  5. linux 文件类型 管理,Linux的文件类型及用户管理

    Linux的文件类型 -,f:普通文件 d:目录文件,路径映射 l:链接文件(符号链接)软连接 设备文件: c:字符设备,一次存取一个字符 b:块设备 p:管道文件 fi,fo s:套接字文件,soc ...

  6. 【AWSL】之Linux文件系统与日志分析(inode、恢复EXT类型的文件、恢复XFS类型的文件)

    序言 这里我主要介绍Linux文件系统与日志分析 文件系统与日志分析 序言 一.inode与block 1. 概述 ①inode的内容 ②inode号码 ③文件存储 ④inode的大小 ⑤inode的 ...

  7. linux文件类型elf,[Linux]四种ELF对象文件类型

    ELF(Executable and Linking Format)是一种对象文件(.o or .obj,目标文件)的格式,用于定义不同类型的对象文件(Object files)中都放了什么东西.以及 ...

  8. linux打补丁前如何备份,关于Linux下给文件打补丁

    在linux下给文件打补丁,需要用到命令diff和patch,下面就分别介绍这两个命令,并演示一个例子. 一.diff命令 diff命令用于比较两个文件或目录的差异,可以结合重定向命令把差异记录下来, ...

  9. Linux C目标文件

    LinuxC目标文件 宗旨:技术的学习是有限的,分享的精神是无限的. 一.目标文件格式(ELF格式) 编译器编译源代码后生成的文件叫做目标文件.目标文件是已经编译后的可执行文件,只是还没有经过链接的过 ...

最新文章

  1. 推荐一款神器:在浏览器中运行 vscode,随时随地写代码
  2. 超融合服务器虚拟化优缺点,超融合是什么 意思?为什么必须是软硬件一体?...
  3. java web编码详解_java web 开发 编码问题详解
  4. 2012年企业Web应用安全防范与趋势展望
  5. 数据告诉你史上最年轻35000分先生到底有多强?
  6. o2 atom(HP rw68xx)系列手机将可以使用Android。
  7. 数据库性能优化—SQL优化十大原则
  8. linux下c代码调用.so,Linux下C程序调用.so(动态链)的一个例子
  9. amqp协议 面试_分布式消息中间件-RabbitMQ面试题(必问)
  10. day10 Python 形参顺序
  11. Python--Flask初学Demo(11.10)
  12. python类方法是什么_python中什么是类方法
  13. android 多图片优化工具,总结Android App内存优化之图片优化
  14. 图像局部特征(十一)--ORB描述子
  15. [YARN-1963] 支持同一个队列内作业按优先级调度
  16. linux常用命令V1.1
  17. 《受欢迎的奶牛》和强连通分支Tarjan算法
  18. 西安交大计算机2000年山西专业录取分数,西安交大在山西各专业录取分数.doc
  19. 软件设计师 如何准备考试(转载)
  20. 形式化方法 Assignment 4: Proof for predicate logic

热门文章

  1. Windows Server 2012中的DirectAccess部署
  2. [转贴]如何成为一个优秀的jsp程序员
  3. ae图片无缝循环滚动_HTML图片滚动
  4. 浙江财经大学java试卷,关于提交2020-2021-1学期课程考核试卷的通知
  5. C语言中指针与数组的区别,C语言 指针与数组的详解及区别
  6. java逐行读取文件内容执行sql语句_[11/100] 文件和异常
  7. ubuntu 16.04安装网易云音乐
  8. python读取txt、csv以及xml文件
  9. 亲密关系沟通-【信任感】-巩固信任感的沟通方法
  10. sonar 配置sonarqube分析unity中的C# 代码