g++编译和链接
2017-06-18 16:20
239 查看
预处理指令
编译成汇编指令
静态链接 (后缀为.a )
假设有这些文件add.h,add.cpp,sub.h,sub.cpp
由.o文件创建静态库可以使用命令
在程序中使用静态库使用命令
动态链接 (后缀名为.so)
创建动态链接库可以使用
也可以使用
在程序中使用动态库
此时运行
动态库的搜索路径先后顺序为:
编译目标代码时指定的动态库搜索路径
环境变量
配置文件
默认的动态库搜索路径
默认的动态库搜索路径
未解决上述问题,采取的步骤为(采用其一即可):
将文件
修改环境变量
静态链接库和动态链接库的特点
动态链接库有利于进程间资源共享。当某个进程需要调用某个动态链接库的函数时,操作系统会查看所有正在运行的进程,看内存里是够有此库函数的拷贝,如果有,则共享那一份拷贝,否则链接载入。而静态链接库不同,每个程序都需要将用到的库函数拷贝到自己的代码段
动态链接库使得程序升级更容易,只要接口不变,新的动态链接库直接可以使用
静态链接是编译时链接,而动态链接是运行时链接,所以静态链接的程序执行速度更快
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
静态链接库和动态链接库的特点
动态链接库有利于进程间资源共享。当某个进程需要调用某个动态链接库的函数时,操作系统会查看所有正在运行的进程,看内存里是够有此库函数的拷贝,如果有,则共享那一份拷贝,否则链接载入。而静态链接库不同,每个程序都需要将用到的库函数拷贝到自己的代码段
动态链接库使得程序升级更容易,只要接口不变,新的动态链接库直接可以使用
静态链接是编译时链接,而动态链接是运行时链接,所以静态链接的程序执行速度更快
相关文章推荐
- gcc/g++ 动态编译和链接问题
- g++ 编译和链接
- g++ 编译链接C++代码, 生成与使用静态库和动态库
- GNU/GCC/G++ 编译/链接生成的常见段(section)表
- g++编译链接文件基础中的基础
- g++ 编译和链接
- g++ 编译和链接
- gcc/g++ 链接库的编译与链接
- g++ 编译链接C++代码, 生成与使用静态库和动态库
- gcc与g++编译链接库文件兼容性
- g++ 编译和链接
- 如何用gcc/g++编译生成so链接库,以及how to use .so
- gcc与g++的编译链接的示例详解
- gcc链接g++编译生成的静态库和动态库的makefile示例
- 使用g++编译C/C++程序,链接时出现undefined reference to错误
- 分析g++的编译与链接初步
- gcc与g++的编译链接的示例详解
- g++ 编译和链接(转)
- g++编译 链接 执行
- linux下g++ 编译时动态库和静态库的链接和头文件问题