欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

g++编译和链接

程序员文章站 2022-03-14 08:27:00
g++编译和链接 预处理指令 g++ -E main.cpp -o main.i 编译成汇编指令 g++ -S main.i -o main.s 静态链接...

g++编译和链接

预处理指令

g++ -E main.cpp -o main.i    

编译成汇编指令

g++ -S main.i -o main.s

静态链接 (后缀为.a )

假设有这些文件add.h,add.cpp,sub.h,sub.cpp

由.o文件创建静态库可以使用命令
    g++ -c add.cpp sub.cpp           
    ar cr libmymath.a add.o sub.o
ar tv libmylib.a可以显示库文件中有哪些目标文件,显示文件名,时间和大小信息 在程序中使用静态库使用命令g++ -o main main.cpp -L. -lmymath

动态链接 (后缀名为.so)

创建动态链接库可以使用
g++ -fPIC -o add.o -c add.cpp     
g++ -fPIC -o sub.o -c sub.cpp      
g++ -shared -o libmymath.so add.o sub.o         

也可以使用

g++ -fPIC -shared -o libmymath.so add.cpp sub.cpp

-fPIC表示编译为位置独立的代码,如果不用此选项的话,不能达到真正的代码段共享的目的
-Lpath表示在path目录中搜索库文件,如-L.表示在当前目录
-Ipath表示在path目录中搜索头文件

在程序中使用动态库
g++ -o main main.cpp -L. -lmymath

此时运行main程序会出错,因为程序运行时会在/usr/lib和/lib中查找需要的动态库文件

动态库的搜索路径先后顺序为:

编译目标代码时指定的动态库搜索路径 环境变量LD_LIBRARY_PATH指定的动态库搜索路径 配置文件/etc/ld.so.conf中指定的动态库搜索路径,只需要在该文件后追加一行完整路径如/root/test/lib即可,然后ldconfig使修改生效 默认的动态库搜索路径/lib 默认的动态库搜索路径/usr/lib
未解决上述问题,采取的步骤为(采用其一即可): 将文件libmymath.so复制到目录/usr/lib中 修改环境变量LD_LIBRARY_PATH,具体命令为
export LD_LIBRARY_PATH=/usr/lib:$LD_LIBRARY_PATH
sodu ldconfig

静态链接库和动态链接库的特点

动态链接库有利于进程间资源共享。当某个进程需要调用某个动态链接库的函数时,操作系统会查看所有正在运行的进程,看内存里是够有此库函数的拷贝,如果有,则共享那一份拷贝,否则链接载入。而静态链接库不同,每个程序都需要将用到的库函数拷贝到自己的代码段 动态链接库使得程序升级更容易,只要接口不变,新的动态链接库直接可以使用 静态链接是编译时链接,而动态链接是运行时链接,所以静态链接的程序执行速度更快