g++静态库与动态库编译

g++静态库与动态库编译

编译过程

  1. 预处理 Pre-Processing .i文件
  2. 编译 Compiling .s文件
  3. 汇编 Assembling .o文件 编译静态库
  4. 链接 Linking bin文件
#—E 对输入文件进行预处理,生成.i文件
g++ -E test.cpp -o test.i

#-S 编译,产生.s文件
g++ -S test.i -o test.s

#-c 汇编,将源代码变成汇编语言 .o文件
g++ -c test.s -o test.o

#-o 将汇编文件生成bin文件
g++ test.o -o test

#执行bin文件
./test

#也可以省略以上步骤,直接执行 g++ HelloWorld.cpp -o HelloWorld01,效果一样
g++ HelloWorld.cpp -o HelloWorld01

编译时的可附加选项

  • -g 编译带调试信息的可执行文件
  • -O[n] 优化源代码,n为优化等级(一般选择 o2等级)
#编译带调试信息的可执行文件
g++ -g HelloWorld.cpp -o HelloWorl01

#编译带优化等级的可执行文件
g++ -o2 HelloWorld.cpp -o HelloWorld02
 

-l和-L,指定库文件,指定库文件路径

  • 小写的-l,可以链接/lib 或者 /usr/lib和 /usr/local/lib里的库直接用-l就能链接
  • 大写的-L,可以链接指定的路径下的库文件
#默认的库路径
g++ -lglog test.cpp

#指定的库路径
g++ -L/home/bing/MyTestFolder -lmytest test.cpp

-I,指定头文件的搜索路径

  • /usr/include 目录一般不用指定,但是如果头文件不在此目录下,则需要使用 -I参数进行指定
g++ -Imyinclude test.cpp (注意-I和路径之间没有/)

-Wall打印警告信息

#打印出gcc提供的警告信息
g++ -Wall test.cpp

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ElBYUULq-1664334175612)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/23ad4bb5-c9de-4e55-b0db-0e1189add53c/Untitled.png)]

-std=c++11设置编译标准

g++ -std=c++11 test.cpp

-D开启宏定义

#HelloWorld.cpp有以下代码:
#include <iostream>
int main()
{
   #ifdef DEBUG
		printf("HelloWorld");
	 #endif
}

g++ -D DEBUG HelloWorld.cpp -o HelloWorld02

生成动态与静态库文件并编译

  • 动态库与静态库区别:静态库在编译期间会被链接并拷贝到程序中,因此运行时不再需要静态库,动态库在编译时不会拷贝到程序中,只有在程序运行时才会被载入,所以程序运行时需要动态库存在,这时会用到 LD_LIBRARY_PATH 指定的路径去查找这个动态库

  • 同时有同名的静态库和动态库时,优先链接动态库

  • 生成静态库(.a)

    #生成编译文件
    g++ src/swap.cpp -I ../include -c         生成swap.o汇编文件
    
    #将汇编文件生成静态库(.a文件),lib.*是一种命名规范,方便下面的-lswap进行索引
    ar rs **libswap.a** swap.o
    
    #将主函数和静态库进行链接,生成可执行文件
    g++ main.cpp -lswap -L ./src -I ./include -o static_main
    
    #执行static_main
    ./static_main
    
  • 生成动态库(.so)

    #生成动态库
    g++ swap.cpp -I../include -fPIC -shared -o libswap.so
    
    **-fPIC中的PIC代表Position Independent Code代表跟相对路径,即位置无关**
    
    #生成可执行文件
    g++ main.cpp -I./include -lswap -L./src -o dyna_main
    
    #指定动态库路径并执行
    LD_LIBRARY_PATH=./src ./dyna_main
    
    等号右边为./src为.so文件所在目录
    
    

实战

#在当前目录创建include文件夹存放swap.h,创建src文件夹存放swap.cpp,创建main.cpp
#编译的时候先写编译的文件,再写编译选项
g++ main.cpp src/swap.cpp -Iinclude -Wall -std=c++11 -o main

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值