一、gcc编译过程

gcc -E hello.c -o hello.s //预处理
gcc -S hello.s -o hello.i //编译
gcc -c hello.i -o hello.o //汇编
gcc hello.o -o hello //链接

1)预处理,C编译器对各种预处理命令进行处理,包括文件包含、宏定义的扩展、条件编译的选择等;

2)编译,将预处理得到的源代码文件,经过“翻译转换”,产生机器程序,得到机器语言的汇编文件;

3)汇编,将汇编代码翻译成机器码,但是还不能运行;

4)链接,处理可重定向文件,把各种符号引用和符号定义转换成为可执行文件中的合适信息,通常是虚拟地址。

二、gcc常用命令参数

1、gdb调试 -g

gcc test.c -o test -g //生成的test可以使用gdb命令进行调试

2、指定所使用到的函数库 -l(小写l);指定函数库所在的文件夹 -L;指定头文件所在的文件夹 -I(大写i);

gcc test.c -L/path/lib -lxxx -I/path/include //使用顺序不分先后

3、编译优化

gcc -O test.c //编译器对代码自动优化编译,默认不优化
gcc -o1 test.c //设置优化级别为1;一般选择2,3会有很多bug风险

4、设置警告为错误

gcc -Werror test.c -o test

5、将所有警告信息全开

gcc -Wall test.c

6、编译时设置宏

gcc test.c -o test -DTRUE //相等于在代码第一行定义 #define TRUE 1
gcc test.c -o test -Dmacro=string //代码第一行定义 #define macro string

7、gcc编译标准

gcc test.c -o test //默认gcc test.c -o test -std=gun89

GCC -std编译标准一览表​c.biancheng.net

三、静态库和动态库

一、静态链接库搜索路径顺序:

  1. ld会去找gcc命令中的参数-L
  2. 环境变量LIBRARY_PATH
  3. 默认路径/lib、/usr/lib、/usr/local/lib

LIBRARY_PATH和LD_LIBRARY_PATH区别与使用:

  • 开发时,设置LIBRARY_PATH,以便gcc能够找到编译时需要的动态链接库。
  • 发布时,设置LD_LIBRARY_PATH,以便程序加载运行时能够自动找到需要的动态链接库。

二、动态链接时、执行时搜索路径顺序:

1)ld.so动态共享库搜索顺序

  1. ELF可执行文件中动态段DT_PATH指定;gcc加入连接参数“-Wl,-rpath”指定动态库搜索路径,多个路径之间用冒号分隔;
  2. 环境变量LD_LIBRARY_PATH指定路径;
  3. /etc/ld.so.cache中缓存的动态库路径。通过配置文件/etc/ld.so.conf增删路径(修改后需要运行ldconfig命令);
  4. /lib/
  5. /usr/lib/

2)与动态库链接相关的命令

  • ld是gcc的链接程序;
  • ldd是查看可执行文件中所依赖的库,eg:ldd a.out;
  • ldconfig用来更新/etc/ld.so.conf文件;
  • nm查看.so库中的函数名字,标记是T的就是动态库里面生成的名字;eg:nm -C test|grep static //在程序文本段查找static

3)动态库搜索路径顺序

  1. 编译目标代码时指定的动态库搜索路径;
  2. 环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
  3. 配置文件/etc/ld.so.conf中指定的动态库搜索路径;/etc/ld/so.conf第一行有个引用命令:include ld.so.conf.d/*.conf;因此最优雅的方式是在ls.so.conf.d目录下创建一个自己的程序依赖的配置文件,配置文件内容为程序依赖的动态库路径,一个路径一行;最后ldconfig更新配置文件;
  4. 默认动态库搜索路径/lib/
  5. 默认动态库搜索路径/usr/lib/

4)动态库路径设置方法

  1. LD_LIBRARY_PATH环境变量指定,也可以放到.bashrv中固化下来,可也以放到当前用户的.bashrc只对当前用户有效;
  2. 如果启用ls.so.cache的话,系统会在/etc/ld.so.cache中存储所有可引用的动态链接库。这个文件内容可以通过/etc/ls.so.conf来指定;这是比较固定的机制,对全局用户有效;设置后需要root调用ldconfig刷新;
  3. 默认的标准库路径,如果是64位,还包括/lib64/、/usr/lib64/
  4. 如果只想对某个特定程序起作用,可以在编译时指定搜索路径。gcc的 -Wl和-rpath参数
  5. /usr/local/lib/和/usr/local/lib64/不在标准路径之列

Linux下动态链接库加载路径及搜索路径问题_Linux_脚本之家​www.jb51.net


ldconfig作用是在ld.so.conf和默认路径(/lib/、/usr/lib/)中所列出目录下搜索动态库;

编译时,ld链接器指定链接什么库,编译程序的最后一步是运行ld;

程序运行时,ld.so动态连接器,根据指定的路径加载库;

缓存文件/etc/ld.so.cahche,保存已经排好序的动态链接库名字列表;

adb: createprocessw failed: 系统找不到指定的路径_gcc编译过程、gcc命令参数、静态库和动态库搜索路径...相关推荐

  1. python安装失败找不到指定路径_使用[WinError 2]安装python-crfsuite失败系统找不到指定的文件...

    我试着安装 $ pip install python-crfsuite Collecting python-crfsuite Using cached python-crfsuite-0.8.4.ta ...

  2. TortoiseSVN Launch Failed Error:系统找不到指定路径

    右键操作TortoiseSVN 各种报 Launch Failed Error:系统找不到指定路径 刚刚安装完成后出现的问题 解决方案:重启电脑

  3. Tomcat SSL Failed to load keystore type JKS with path 系统找不到指定文件

    Tomcat6 启用 SSL,配置 <Connector port="8443" protocol="org.apache.coyote.http11.Http11 ...

  4. Java如何获取IP属地 ip2region failed to create searcher with x:java.io.FileNotFoundException:( 系统找不到指定的路径)

    目录 引言 获取ip地址 使用ServerHttpRequest获取ip完整地址: 获取ip地址的源代码 接口调用源代码 使用HttpServletRequest获取ip完整地址 获取ip地址的源代码 ...

  5. pyinstall Failed to execute script ‘main‘ due to unhandled exception: [WinError 3]系统找不到指定的路径,包含文件夹

    问题 Failed to execute script 'main' due to unhandled exception: [WinError 3]系统找不到指定的路径 打包文件 包含文件夹 YOL ...

  6. FireDAC 报系统找不到指定的文件错误,解决之道。

    报:[FireDAC][Phys][MySQL]-314. Cannot load vendor library [libmysql.dll or libmysqld.dll]. 系统找不到指定的文件 ...

  7. Winodws10 VS2019 Clion CMake 编译 OpenCV rc 系统找不到指定的文件。NMAKE : fatal error U1077

    在从源码编译开源库这条路上,怎么这么多坑给我踩? 这次是编译 OpenCV. 简单总结 在 Windows10 系统下,使用 VS2019 编译链,在 Clion 编译 OpenCV 时,出现报错,报 ...

  8. 解决java.io.IOException: Cannot run program cygpath: CreateProcess error=2, 系统找不到指定的文件 的错误...

    一.外部环境: 系统环境:Windows 8 磁盘分区:只有C盘 开发环境:IntelliJ IDEA Community Edition 2016.1.3(64) 执行代码:rdd.saveAsTe ...

  9. svn更新代码提示“系统找不到指定路径”

    在使用svn时,更新代码是出现: clean up failed to process the fallowing......"系统找不到指定路径" 根据上一句话可以查到是因为更新 ...

最新文章

  1. 【TCP/IP】IP路由选择
  2. Server2008 RMS測試
  3. 移动端web开发分享
  4. openstack常用命令及控制节点端口一览
  5. 新版上线时发现的数据库优化问题
  6. python遍历excel_python遍历文件读取并写结果到excel
  7. Kafka系统的组件、角色以及和zookeeper的关系
  8. 非常不错的文章,囊括啦高性能、高可用的分布式架构体系所有名词
  9. BZOJ1922 SDOI2010 大陆争霸 最短路
  10. MySQL保留2位小数
  11. 对上拉下拉电阻的作用作个总结(想了解的过来看看)(转载)
  12. ipvs,ipvsadm的安装及使用
  13. html 不显示null,如果model.entity为null,则不显示/写特定的html
  14. 回调函数是同步还是异步_[React] 4 - setState / 异步还是同步?
  15. LINUX编译:通过prefix把编译结果输出到指定位置
  16. Raki的读paper小记:RoBERTa: A Robustly Optimized BERT Pretraining Approach
  17. 主流智能家居通信总线、无线、电力载波和以太网的基本介绍
  18. Vcenter证书过期处理----Vcenter无法登录,“根证书错误”,“签名证书无效”,“503 service not available”
  19. 骁龙768G相当于什么处理器 骁龙780g什么水平
  20. 微软的100道算法面试题(终结版)

热门文章

  1. 文献记录(part51)--识别聚类间远近关系的双几何体模型
  2. 华南理工专科计算机随堂联系,华南理工大学网络教育计算机基础随堂练习第三章...
  3. java string 字符个数字_java从字符串中提取数字
  4. viterbi算法_序列比对(十四)——viterbi算法和后验解码的比较
  5. 如何自行找出 SAP Spartacus 查询用户信息的 API Service 类
  6. 在 Visual Studio Code 里编辑 Excel 和 csv 文件两个比较方便的扩展应用
  7. ABAP, UI5和webpack的处理入口
  8. 如何处理SAP HANA Web-Based Development Workbench的403 Forbidden错误
  9. i18n - why Chinese resource will be loaded by default
  10. SAP云平台ABAP编程环境免费账号使用过程中的一些问题