【转】关于编译链接——gcc/g++

添加运行时共享库目录



运行使用共享库的程序需要加载共享库(不同于G++
编译时指定的链接库),添加共享库的步骤:

  1. 修改文件 /etc/ld.so.conf
    添加共享库目录

  2. 运行 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,[email protected]) $<‘ >$(DsDir)/[email protected]
# 使得每一个 .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++,布布扣,bubuko.com

时间: 2024-10-29 19:06:04

【转】关于编译链接——gcc/g++的相关文章

gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解

摘自http://blog.csdn.net/elfprincexu/article/details/45043971 gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解 C和C++编译器是集成的,编译一般分为四个步骤: 预处理(preprocessing)  ----------------- cpp/ gcc -E  编译(compilation) ------------------ cc1 / gcc -S 汇编(assembly)  ----------------

学习记录:gcc/g++ 编译与链接

gcc/g++ 编译与链接 编译与链接的过程可以分解为四个步骤:预处理.编译.汇编.链接 预处理:源代码文件和相关的头文件,被预处理器cpp预处理成一个后缀为 .i 的文件(选项:-E) 编译:把预处理完的文件进行一系列的词法分析.语法分析.语义分析以及优化后,产生相应的汇编代码文件,后缀为 .s,(选项 :-S ) 汇编:把编译阶段生成的 .s 文件转成二进制目标代码,后缀为.o,(选项:-c) 链接:把每个源代码模块独立地编译,然后按照要将它们"组装"起来.链接的主要内容就是把各个

Linux gcc/g++链接编译顺序详解

gcc/g++链接时对库的顺序要求 -Ldir Add directory dir to the list of directories to be searched for -l. -llibrary -l library Search the library named library when linking. (The second alternative with the library as a separate argument is only for POSIX complian

gcc/g++编译(生动形象,从最容易入手的hello world解释了库的概念)

1. gcc/g++在执行编译工作的时候,总共需要4步 (1).预处理,生成.i的文件[预处理器cpp] (2).将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs] (3).有汇编变为目标代码(机器代码)生成.o的文件[汇编器as] (4).连接目标代码,生成可执行程序[链接器ld] [参数详解] -x language filename    设定文件所使用的语言,使后缀名无效,对以后的多个有效.也就是根据约定C语言的后缀名称是.c的,而C++的后缀名是.C或者.cpp,如果你很

gcc g++支持C++11 标准编译及其区别

g++ -g -Wall -std=c++11 main.cpp gcc -g -Wall -std=c11 main.cpp 如果不想每次写这个-std=C++11这个选项该怎么办呢? 方法出处:http://stackoverflow.com/questions/16886591/how-do-i-enable-c11-in-gcc 方法1:写Makefile 方法2:取别名 :alias g++11="g++ -std=c++11" -----------------------

gcc/g++实战之动态链接库与静态链接库编写

函数库一般分为静态库和动态库两种. 静态库: 是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了.其后缀名一般为”.a”. 动态库: 与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销.动态库一般后缀名为”.so”,gcc/g++在编译时默认使用动态库.无论静态库,还是动态库,都是由.o文件创建的. 动态库的编译: 下面通过一个例子来介绍如何生成一个动态库.建一个头文

gcc/g++ 实战之编译过程

gcc和g++分别是GNU(一个开源组织)的c&c++编译器 对于.c后缀的文件,gcc把它当做是C程序,g++当做是C++程序:对于.cpp后缀的文件,gcc和g++都会当做c++程序.gcc可以根据后缀名为.c或.cpp分别按c程序和c++程序来编译,但是g++无论是.c或.cpp都统一按c++程序来编译. 编译阶段,g++会调用gcc,链接阶段通常会用g++来完成,g++在编译的过程中,其实是调用gcc按照c++程序来编译的.即编译工作最终都是由gcc来完成的.这是因为gcc命令不能自动和

gcc/g++链接时.o文件及库的顺序问题

折腾gcc/g++链接时.o文件及库的顺序问题 链接静态库的顺序问题 GCC 编译使用动态链接库和静态链接库--及先后顺序----及环境变量设置总结

C++常见gcc编译链接错误解决方法

除非明确说明,本文内容仅针对x86/x86_64的Linux开发环境,有朋友说baidu不到,开个贴记录一下(加粗字体是关键词): 用“-Wl,-Bstatic”指定链接静态库,使用“-Wl,-Bdynamic”指定链接共享库,使用示例:-Wl,-Bstatic -lmysqlclient_r -lssl -lcrypto -Wl,-Bdynamic -lrt -Wl,-Bdynamic -pthread -Wl,-Bstatic -lgtest("-Wl"表示是传递给链接器ld的参数