• 【转】关于编译链接——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,$@) $<' >$(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
  • 相关阅读:
    六十三:CSRF攻击与防御之系统准备之登录与转账功能
    六十二:CSRF攻击与防御之系统准备之注册功能
    六十一:Flask.Session之flask操作session
    并发编程之多进程篇之二
    并发编程之多进程篇之一
    网络编程之文件传输实例
    网络编程基础之粘包现象与UDP协议
    网络编程基础之Socket套接字简单应用
    TCP协议的三次握手和四次挥手
    网络编程基础之Socket套接字
  • 原文地址:https://www.cnblogs.com/big-xuyue/p/3774829.html
Copyright © 2020-2023  润新知