gcc杂谈
1. -l选项自动给库文件名增加lib前缀和.a/.so后缀。所以如果你有一个lib叫做libusb.a,那么编译选项是-lusb。另一方面,如果你有一个文件叫做libusb.o(是目标文件而不是库文件),并希望将其作为库的形式使用,那么使用-llibusb.o。
2. pkg-config
这玩意自动给你的gcc命令行加上相关的lib和include位置选项。例如:
gcc -o test test.c ·pkg-config --libs --cflags glib-2.0·
附上pkg-config项目自己给出的介绍:
pkg-config is a helper tool used when compiling applications and libraries. It helps you insert the correct compiler options on the command line so an application can use gcc -o test test.c pkg-config --libs --cflags glib-2.0 for instance, rather than hard-coding values on where to find glib (or other libraries). It is language-agnostic, so it can be used for defining the location of documentation tools, for instance.
3. ldconfig
Linux在加载应用程序的时候,并不直接加载共享库,而是由/lib/ld.so来干这个事情。ld.so在标准路径(/lib,/usr/lib)中寻找共享库。But,如果.so在非标路径,ld.so就抓虾了。所以,我们需要将非标路径加入/etc/ld.so.conf,然后运行ldconfig生成/etc/ld.so.cache。ld.so加载共享库的时候,会从ld.so.cache查找(但不会理睬ld.so.conf!)。
4. 静态库和动态库
4.1 静态库的生成
使用gcc -c生成.o文件,然后使用ar归档为.a文件。
4.2 静态库的使用
4.2.1 直接将.a作为源代码交给gcc:
gcc x.c libmy.a -o myelf
4.2.2 通过指定库文件位置:
gcc -o myelf x.c -LYOUR_LIB_PATH -lmy
4.3 动态库的生成
gcc -o libmy.so -shared my.o [-fPIC]
所生成的.so同时用于编译和执行。
4.4 -fPIC
-fPIC选项生成位置无关代码,即.so内的代码和数据在使用时不需要重定位,但也因为此,只能通过got(global offset table)间接寻址。如果不使用-fPIC,.so在使用时必须进行重定位,为每个使用该库的进程都在物理内存中复制一份副本,因为需要修改其中的地址。
4.5 动态库的使用
4.5.1 直接将.so交给gcc
gcc x.c libmy.so -o myelf
这种方法生成的ELF文件中包含编译时so文件所在的位置,在执行时要求so文件处于相同位置。
4.5.2 使用-L和-l指定.so位置
gcc -o myelf x.c -LYOUR_LIB_PATH -lmy
4.5.3 使用dlopen在应用程序执行时加载
参考http://www.ibm.com/developerworks/cn/linux/l-dynamic-libraries/index.html
4.5.4 其他
上面我们说过,.so同时用于编译和执行,但编译和执行时的查找方式和顺序是不一样的(嗯,在历史上曾经一样过)。
编译时gcc的查找顺序:
- LIBRARY_PATH(仅对native编译器有效,对cross compiler无效)
- -L -l指定位置
- 标准位置
执行时ld.so的查找顺序:
- LD_LIBRARY_PATH
- 标准位置
- ld.so.cache指定位置
4.6 可以通过ldd查看某个应用程序需要哪些动态库
gcc杂谈的更多相关文章
- Linux杂谈: gcc对结构体大小的默认处理方式
1. 发现问题 最近在编写代码过程中发现,对一个结构体进行 sizeof 操作时,有时候大小是填充过的,有时候又没有填充. 那么,如果在代码中没有显示的指定要求编译器进行对齐时,gcc的默认处理是怎样 ...
- 子树大小平衡树(Size Balanced Tree,SBT)操作模板及杂谈
基础知识(包括但不限于:二叉查找树是啥,SBT又是啥反正又不能吃,平衡树怎么旋转,等等)在这里就不(lan)予(de)赘(duo)述(xie)了. 先贴代码(数组模拟): int seed; int ...
- VSCode调试go语言出现:exec: "gcc": executable file not found in %PATH%
1.问题描述 由于安装VS15 Preview 5,搞的系统由重新安装一次:在用vscdoe编译go语言时,出现以下问题: # odbcexec: "gcc": executabl ...
- GCC学习(1)之MinGW使用
GCC学习(1)之MinGW使用 因为后续打算分享一些有关GCC的使用心得的文章,就把此篇当作一个小预热,依此来了解下使用GNU工具链(gcc.gdb.make等)在脱离IDE的情况下如何开发以及涉及 ...
- 使用 GCC 和 GNU Binutils 编写能在 x86 实模式运行的 16 位代码
不可否认,这次的标题有点长.之所以把标题写得这么详细,主要是为了搜索引擎能够准确地把确实需要了解 GCC 生成 16 位实模式代码方法的朋友带到我的博客.先说一下背景,编写能在 x86 实模式下运行的 ...
- [异常解决] How to build a gcc toolchain for nRF51 on linux (very detailed!!!)
1.Install gcc-arm-none-eabi https://devzone.nordicsemi.com/tutorials/7/This link shows that developm ...
- CentOS 6.6 升级GCC G++ (当前最新版本为v6.1.0) (完整)
---恢复内容开始--- CentOS 6.6 升级GCC G++ (当前最新GCC/G++版本为v6.1.0) 没有便捷方式, yum update.... yum install 或者 添加y ...
- GCC 预处理、编译、汇编、链接..
1简介 GCC 的意思也只是 GNU C Compiler 而已.经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言:它现在还支持 Ada 语言.C++ 语言.Java 语言.Objective ...
- 用gcc进行程序的编译
在Linux系统上,一个档案能不能被执行看的是有没有可执行的那个权限(x),不过,Linux系统上真正认识的可执行文件其实是二进制文件(binary program),例如/usr/bin/passw ...
随机推荐
- selenium执行js报错
selenium执行js报错 Traceback (most recent call last): dr.execute_script(js) File "C:\Python27\l ...
- hive数据导入方法
可以通过多种方式将数据导入hive表 1.通过外部表导入 用户在hive上建external表,建表的同时指定hdfs路径,在数据拷贝到指定hdfs路径的同时,也同时完成数据插入external表. ...
- lost+found目录
If you run fsck, the filesystem check and repair command, it might find data fragments that are not ...
- 传统解析xml的方式
1. 介绍 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允 ...
- 20145220 实验五 Java网络编程
20145220 实验五 Java网络编程 实验内容 1.用书上的TCP代码,实现服务器与客户端. 2.客户端与服务器连接 3.客户端中输入明文,利用DES算法加密,DES的秘钥用RSA公钥密码中服务 ...
- Jewelry Exhibition(最小点覆盖集)
Jewelry Exhibition 时间限制: 1 Sec 内存限制: 64 MB提交: 3 解决: 3[提交][状态][讨论版] 题目描述 To guard the art jewelry e ...
- CodeForces 558A
Description Amr lives in Lala Land. Lala Land is a very beautiful country that is located on a coord ...
- [luogu P2170] 选学霸(并查集+dp)
题目传送门:https://www.luogu.org/problem/show?pid=2170 题目描述 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一 ...
- https那些事儿
(一)SSL/TLS协议运行机制的概述 一.作用 不使用SSL/TLS的HTTP通信,就是不加密的通信.所有信息明文传播,带来了三大风险. (1) 窃听风险(eavesdropping):第三方可以获 ...
- kuangbin_ShortPath A (POJ 2387)
最短路模板题 但是其实很费时间 因为要看明白dij floyd 以及 dij优化 spfa优化 交了三次 大概是理解了 不过涉及到priority_queue的重载运算符问题 以后要在C++里面好好看 ...