【转】关于编译链接——gcc/g++
添加运行时共享库目录
运行使用共享库的程序需要加载共享库(不同于G++ 编译时指定的链接库),添加共享库的步骤:
修改文件 /etc/ld.so.conf 添加共享库目录
运行 ldconfig 同步更新一下
如:
$ gedit /etc/ld.so.conf
#添加 /root/dreamlove/lib
$ ldconfig
添加include,lib的搜寻路径
对所有用户有效修改/etc/profile
对个人有效则修改~/.bashrc
#在PATH中找到可执行文件程序的路径。
export PATH =$PATH:$HOME/bin
#gcc找到头文件的路径
C_INCLUDE_PATH=/usr/include/libxml2:/MyLib export C_INCLUDE_PATH
#g++找到头文件的路径
CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/include/libxml2:/MyLib export CPLUS_INCLUDE_PATH
#找到动态链接库的路径
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/MyLib export LD_LIBRARY_PATH
#找到静态库的路径
LIBRARY_PATH=$LIBRARY_PATH:/MyLib export LIBRARY_PATH
使用source,加载这些定义使其立即生效;或者重启
g++编译时的流程
- 调用预编器CPP进行预处理,生成.i文件
- 调用编译器egcs进行汇编,生成.s文件
- 调用汇编器as生成目标,.o文件
- 调用连接器ld进行链接,生成可执行文
g++使用注意项
用于链接库的 -l 选项必须放在 g++ 选项后面,如:
$ g++ -o ./tmpExec/pthread pthread.cpp -lpthread
#这个是正确的
$ g++ -lpthread -o ./tmpExec/pthread pthead.cpp #出错
应该注意的选项
MM选项与M选项
生成文件的依赖关系,比如:g++ -MM testMM.cpp;将依赖关系输出到屏幕上,此时应该对其进行重定向;-MM是不会进行语法检查的。只是对源文件的include关系进行分析得到依赖关系;如
#include <unistd.h>
#include "geteth0Ip.h" int mian(){
return;
}
//这个漏洞百出的源文件仍然可以使用-MM获得它的依赖关系
与 makefile 的使用:
$(dfiles):%.d:%.cpp
@g++ -MM $< | sed '$ a\\tg++ -c -o $(ObjsDir)/$(patsubst %.d,%.o,$@) $<' >$(DsDir)/$@
# 使得每一个 .d 文件都包含着一个完整的规则
常用选项
选项 | 参数 | 描述 | 例子 |
-x | 'c|c++|..|' | 不再根据源文件的后缀名来判断编写源文件的语言,即指定源文件的语言 | g++ -x 'c++' test.txt |
-E | 只执行编译的第一个流程:预处理,不会生成文件,可以重定向到文件 | g++ -E test.cpp | |
-S | 执行编译的前两个流程生成汇编代码 | g++ -S test.cpp | |
-c | 执行前三个流程生成目标文件 | g++ -c test.cpp | |
-o | 目标文件名 | 重命名目标文件名 | g++ -S -o test.asm test.cpp |
-pipe | 使用管道来存储文件,下一个流程从/tmp/文件夹中读取上一个流程的结果,使用pipe后,上一个流程将结果保存在内存中,下一个流程直接从内存中读取上一个流程的结果 | g++ -pipe -o test.exe test.cpp | |
-ansi | 关闭gun的特性,使代码全面符合ansi要求,从而具有高移植性 | g++ -ansi -o test.ext test.cpp | |
-fno-asm | -ansi的一部分:将asm,inline,typeof视为普通标识符 | g++ -fno-asm -o test.exe test.cpp | |
-fno-strict-prototype | 不再支持 | ||
-fthis-is-variable | 不再支持 | ||
-fcond-mismatch | 允许条件表达式的第2,3个参数的类型不一致,现已默认开启 | 默认开启 | |
-funsigned-char -fno-signed-char -fsigned-char -fno-unsigned-char |
对char类型进行设置,决定将char类型设置成unsigned char(前两个参数)或者signed char(后两个参数) | ||
-imacros | 包含宏的文件 | 相当于include,可以直接使用参数文件里的宏 | g++ -imacros hello.mac hello.cpp |
-Dmacro -Dmacro=defn |
macro为参数 | 相当于#define macro | g++ -DUNICODE -o test.exe hello.cpp |
-Umacro | macro为参数 | 相当于#undef macro,不能取消在文本文件中定义的宏! | g++ -UUNICODE -o test.exe hello.cpp |
-undef | 取消对任何非标准宏的定义 | g++ -undef -o test.exe hello.cpp | |
-Idir | dir就是参数 | 一般查找头文件顺序:-I指定的目录->当前目录->环境变量定义的目录 | g++ -I'C:/Users/Dream/Desktop/' -o test.exe hello.cpp |
-nostdinc | 使编译器不在系统缺省的头文件目录里面找头文件 | g++ -nostdinc -o test.exe -c hello.cpp | |
-C | 在预处理的时候,不删除注释信息,一般和-E使用,有时候分析程序,用这个很方便的 | g++ -E -C -o test.h hello.cpp | |
-M | 生成文件关联的信息。包含目标文件所依赖的所有源文件,这个在制作makefile应该会很有用 | g++ -M -o test1.h hello.cpp | |
-MM | 同-M,不过忽略#include<file>>造成的依赖关系 | g++ -MM -o test.h hello.cpp | |
-Wa | options | 传递参数给as(汇编器) | |
-Wl | options | 传递参数为ld(连接器) | |
-llibs | lib就是参数 | 指定编译的时候所使用的库,liblibs.so(如果static选项设置的话就是liblibs.a) | g++ -lprint hello.cpp(链接 libprint.so) |
-Ldir | dir就是参数 | 指定查找链接库时的目录 | g++ -L'C:/Users/Dream/Desktop/' -lprint hello.cpp |
-On | n为参数,表示优化等级取:0,1,2,3 | 进行相应程度的优化 | g++ -O3 -o test3.asm -S hello.cpp |
-g -ggdb -gstabs -gstabe+ |
生成调试信息,可以被gdb使用 尽可能地生成gdb格式的调试信息 生成stabs格式的调试信息 同时shengc stabs,gdb格式的信息 |
g++ -g hello.cpp |
【转】关于编译链接——gcc/g++的更多相关文章
- Linux 编译工具 gcc/g++、Make/Makefile、CMake/CMakeLists.txt、qmake
前言 编译器的主要工作流程: 源码(Source Code)>> 预处理器(Preprocessor)>> 编译器(Compiler)>> 汇编程序(Assembl ...
- 【C编程基础】C编译链接命令gccc
1.gcc安装 rpm -qa|grep gcc ==>检查gcc是否安装 gcc -v ==>检查gcc版本 yum -y install gcc ==>安装gcc 2.基本语法 ...
- gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解
摘自http://blog.csdn.net/elfprincexu/article/details/45043971 gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解 C和C+ ...
- gcc与g++的编译链接的示例详解
一.编译方式的示例详解 1. 编译C代码 代码如下:main.c /*! ************************************************************** ...
- 学习总结:gcc/g++ 编译与链接
gcc/g++ 编译与链接 编译与链接的过程可以分解为四个步骤:预处理.编译.汇编.链接 预处理:源代码文件和相关的头文件,被预处理器cpp预处理成一个后缀为 .i 的文件(选项:-E) 编译:把预处 ...
- Linux gcc/g++链接编译顺序详解
gcc/g++链接时对库的顺序要求 -Ldir Add directory dir to the list of directories to be searched for -l. -llibrar ...
- gcc/g++ 链接库的编译与链接
GCC编译步骤 gcc -E t1.c -o t1.i 预处理 gcc -S t1.i -o t1.s 转成汇编语言 gcc -c t1.s -o t1.o 转成机器码 gcc t1.o -o t1. ...
- C++常见gcc编译链接错误解决方法
除非明确说明,本文内容仅针对x86/x86_64的Linux开发环境,有朋友说baidu不到,开个贴记录一下(加粗字体是关键词): 用“-Wl,-Bstatic”指定链接静态库,使用“-Wl,-Bdy ...
- gcc/g++链接时.o文件及库的顺序问题
折腾gcc/g++链接时.o文件及库的顺序问题 链接静态库的顺序问题 GCC 编译使用动态链接库和静态链接库--及先后顺序----及环境变量设置总结
随机推荐
- 基于OpenGL编写一个简易的2D渲染框架-08 重构渲染器-整体架构
事实上,前面编写的渲染器 Renderer 非常简陋,虽然能够进行一些简单的渲染,但是它并不能满足我们的要求. 当渲染粒子系统时,需要开启混合模式,但渲染其他顶点时却不需要开启混合模式.所以同时渲染粒 ...
- 【Web缓存机制系列】2 – Web浏览器的缓存机制
Web缓存的工作原理 所有的缓存都是基于一套规则来帮助他们决定什么时候使用缓存中的副本提供服务(假设有副本可用的情况下,未被销毁回收或者未被删除修改).这些规则有的在协议中有定义(如HTTP协议1.0 ...
- OPTION SQL_SELECT_LIMIT=DEFAULT'
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version ...
- iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 解析JSON
视频地址:https://www.cctalk.com/v/15114923886141 JSON 数据 我颠倒了整个世界,只为摆正你的倒影. 前面的文章中,我们已经完成了项目中常见的问题,比如 路由 ...
- Numpy 基础知识
1.使用ipython --pylab 自动加载 Numpy.Scipy.Matplotlib模块. 创建数组a = arange(10) b = arange(10,dtype='f')c = ar ...
- HttpClientUtil 工具类
/* * * * FileName: s.java * * Description:TODO(用一句话描述该文件做什么) * * Created: jiangzhanghong 2017年11月14日 ...
- 记一次JPA查询分页导致的数据丢失问题
使用JPA查询,共17条数据,每页10条数据. 第一页与第二页有一条重复的数据,导致丢失一条数据 后查明原因发现,该查询使用了排序,排序字段的值在多条数据中相同,比如在3-11条是相同的值.此时跳到第 ...
- Windows phone 自定义控件(无外观控件)——ColorPicker
编码前 在上一篇博客中,写的是一个UserControl的子类,它具有固定的外观(虽然也可以通过样式来进行修改,但受到的限制很大).如果你想要使用这个控件的逻辑,但是希望在使用的时候可以更改控件的外观 ...
- 利用X.509证书对XML进行加密和签名
综述 XML加密和签名技术应用非常广泛. ASP.NET 使用XML加密对配置信息进行加密:InfoPath使用XML签名对表单进行签名:Web服务使用XML加密和签名对SOAP消息进行加 ...
- Unity即将内置骨骼动画插件Anima2D
Unity一直在寻找新的方法来帮助开发者,并为他们提供最好的工具.在此我们向大家宣布,Unity将内置流行的骨骼动画插件Anima2D,从2017年1月开始免费供所有Unity开发者使用! 同时也欢迎 ...