您的位置:首页 > 其它

g++编译和链接

2017-06-18 16:20 239 查看
预处理指令

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


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

动态链接库有利于进程间资源共享。当某个进程需要调用某个动态链接库的函数时,操作系统会查看所有正在运行的进程,看内存里是够有此库函数的拷贝,如果有,则共享那一份拷贝,否则链接载入。而静态链接库不同,每个程序都需要将用到的库函数拷贝到自己的代码段

动态链接库使得程序升级更容易,只要接口不变,新的动态链接库直接可以使用

静态链接是编译时链接,而动态链接是运行时链接,所以静态链接的程序执行速度更快
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息