在Linux下使用C语言开发应用程序时,完全不使用第三方函数库的情况是比较少见的,通常来讲都需要借助一个或多个函数库的支持才能够完成相应的功能。从程序员的角度看,函数库实际上就是一些头文件(.h)和库文件(.so或者.a)的集合。虽然Linux下大多数函数都默认将头文件放到/usr/include/目录下,而库文件则放到/usr/lib/目录下,但并不是所有的情况都是这样。正因如此,gcc在编译时必须让编译器知道如何来查找所需要的头文件和库文件。
gcc采用搜索目录的办法来查找所需要的文件,-I选项可以向gcc的头文件搜索路径中添加新的目录。例如,如果在/home/david/include/目录下有编译时所需要的头文件,为了让gcc能够顺利地找到它们,就可以使用-I选项:
[david@DAVID david]$ gcc david.c -I /home/david/include -o david
同样,如果使用了不在标准位置的库文件,那么可以通过-L选项向gcc的库文件搜索路径中添加新的目录。例如,如果在/home/david/lib/目录下有链接时所需要的库文件libdavid.so,为了让gcc能够顺利地找到它,可以使用下面的命令:
[david@DAVID david]$ gcc david.c -L /home/david/lib –ldavid -o david
值得详细解释一下的是-l选项,它指示gcc去连接库文件david.so。Linux下的库文件在命名时有一个约定,那就是应该以lib三个字母开头。由于所有的库文件都遵循了同样的规范,因此在用-l选项指定链接的库文件名时可以省去lib三个字母。也就是说gcc在对-l david进行处理时,会自动去链接名为libdavid.so的文件。
Linux下的库文件分为两大类,分别是动态链接库(通常以.so结尾)和静态链接库(通常以.a结尾),两者的差别仅在于程序执行时所需的代码是在运行时动态加载的,还是在编译时静态加载的。默认情况下,gcc在链接时优先使用动态链接库,只有当动态链接库不存在时才考虑使用静态链接库。如果需要的话可以在编译时加上-static选项,强制使用静态链接库。例如,如果在/home/david/lib/目录下有链接时所需要的库文件libfoo.so和libfoo.a,为了让gcc在链接时只用到静态链接库,可以使用下面的命令:
[david@DAVID david]$ gcc foo.c -L /home/david/lib -static –ldavid -o
david

转载于:https://blog.51cto.com/enchen/149682

linux c 库依赖相关推荐

  1. linux动态库查找路径以及依赖关系梳理

    编译时与运行时库的路径 linux下,编译时与运行时库的搜索路径是不同的 运行时动态库的路径搜索顺序 LD_PRELOAD环境变量,一般用于hack 编译目标代码时指定的动态库搜索路径(指的是用 -w ...

  2. Linux动态库的动态加载与静态加载以及加载依赖了其他动态库的动态库

    Linux动态库加载 在Linux下,动态库格式一般为libxxx.so或者libxxx.so.3这种格式. 通常我们在网上下载下来源码包,编译之后会是libxxx.so软连接libxxx.so.1链 ...

  3. linux动态库命名规则

    说道"动态库版本兼容",很多人头脑中首先蹦出的就是"Dll Hell".啊,这曾经让人头疼的难题.时至今日,这个难题已经很好地解决了.   在进一步讨论之前来思 ...

  4. 解决Linux动态库版本兼容问题

    说道"动态库版本兼容",很多人头脑中首先蹦出的就是"Dll Hell".啊,这曾经让人头疼的难题.时至今日,这个难题已经很好地解决了.   在进一步讨论之前来思 ...

  5. Qt动态库静态库的创建、使用、多级库依赖、动态库改成静态库等详细说明

    本文描述的是windows系统下,通过qtcreator在pro文件中添加动态库与静态库的方法: 1.添加动态库(直接添加动态库文件.dll,非子项目) 通过qtcreator创建动态库的方法就不在此 ...

  6. linux动态链接库的使用,Linux动态库soname的使用

    通过一个简单的例子,体验一下Linux动态库soname的使用. 假设有一个动态库:libbar.so.1.1.0,其对应的三个名称如下. realname:libbar.so.1.1.0 sonam ...

  7. 分析Windows和Linux动态库

    摘要:动态链接库技术实现和设计程序常用的技术,在Windows和Linux系统中都有动态库的概念,采用动态库可以有效的减少程序大小,节省空间,提高效率,增加程序的可扩展性,便于模块化管理.但不同操作系 ...

  8. linux系统中 库分为静态库和,你知道linux 静态库和共享库?

    1.静态库和共享库 静态库和共享库(动态库),二者的不同点在于代码被载入的时刻不同. 静态库的代码在编译过程中已经被载入可执行程序,因此体积较大. 共享库的代码是在可执行程序运行时才载入内存的,在编译 ...

  9. VS远程开发(远程调试)编译报错:对‘xxx’未定义的引用(设置库依赖顺序)(已解决)pthread(项目-->属性-->链接器-->输入-->库依赖项)

    如图在VS中对linux进行远程开发时,编译报错: 貌似是因为在代码中使用了pthread.h的函数,链接库依赖顺序出了问题,我在ubuntu里手动使用gcc main.c -lpthread -o ...

  10. linux 动态库建立,浅析linux下静态库和动态库的建立和使用

    在粤嵌学了很多知识,我们把常用的公用函数放在一起做成一个函数库,可以供其他程序共同使用,函数库本质上说,是一个可执行代码的二进制形式,可被操作系统载入内存执行.linux下的库分为两种:静态库,后缀名 ...

最新文章

  1. 人口普查(20) PAT
  2. 多台服务器通过ssh 无密钥直接登陆主机
  3. ST17H26移植软时钟代码
  4. sap中用函数增加断点(break point)
  5. 图文详解远程部署ASP.NET MVC 5项目
  6. 微软对键盘上的Page Up Page Down按钮享有专利权
  7. 蓝桥杯 ADV-91 算法提高 素数判断
  8. mysql truncate很慢_mysql truncate 的问题
  9. php5.3 本地调试,WIN7下PHP 5.3.27和PHPStorm6调试
  10. 4——编码规则以及vim的使用和虚拟环境
  11. 使用线程池管理线程!
  12. CSDN会员免费拿,实现CSDN会员自由的机会到了!!!
  13. 在mac 上安装 mpkg
  14. (判断题)两台路由器之间转发的数据包一定不携带VLAN TAG?
  15. vscode git error: would clobber existing tag
  16. 华为云教程(虚拟私有云VPC)
  17. 星淘惠告诉你跨境平台那么多,凭什么要选亚马逊?
  18. 中国各地特色商品大全
  19. AI入门: 关于人工智能的深度思考
  20. 5.3. nightly version

热门文章

  1. 与postman的第一次亲密接触
  2. uoj #298. 【CTSC2017】网络
  3. UVA - 10129 Play on Words(欧拉回路)
  4. Oracle 动态视图3 V$SESSION
  5. js鼠标禁止右键、复制粘贴代码
  6. 在java中什么管理内存_Java是如何管理内存
  7. Tachyon:Spark生态系统中的分布式内存文件系统的使用
  8. 洛谷P3768 简单的数学题
  9. 【笔记】时间片轮转 RR 进程调度算法(Java 实现)
  10. 19.12添加自定义监控项目19.13/19.14 配置邮件告警19.15 测试告警19.16 不发邮件的问题处理...