linux下C++生成并使用静态库和静态库
为了保证以下程序能正常编译,请先按照提供的操作搭建好目录结构:创建一个Demo文件夹,文件夹下创建一个Fun文件夹,创建好后进入Fun文件目录下,创建math.cpp和math.h文件。
编写math.h和math.cpp内容。
// math.h #include <iostream> using namespace std; // 定义add函数 int add(int a, int b);// math.cpp #include "math.h" // add函数实现 int add(int a, int b) { return (a + b); }一、静态库生成和使用
在Fun目录下,使用g++命令将上面准备好的math.cpp编译成.a文件,输入命令后会在当前目录下生成一个libmath.a的文件,这个文件就是静态库。
g++ -c -o libmath.a math.cpp # -c 表示只编译不链接 # 静态库命名规范:lib开头,.a后缀名确定生成静态库后,回到上一级目录下,即Demo目录下,创建demo.cpp。
# demo.cpp #include "Fun/math.h" int main() { int a = 44; int b = 66; std::cout << add(a, b) << std::endl; return 0; }使用生成的libmath.a文件来编译demo.cpp文件。
# 方法一,直接指定.a文件, g++ -o demo demo.cpp /home/long/c++/lib_so/Demo/Fun/libmath.a # 方法二,使用-L参数,这种是规范用法,会自动找到.a文件,建议用这种方式 # 注意最后一级目录不要加/,否则会找不到库 g++ -o demo demo.cpp -L/home/long/c++/lib_so/Demo/Fun -lmath方法一运行结果
方法二运行结果
二、动态库生成和使用
注意:所有生成动态库的程序使用都是静态库中的源程序,不做任何修改。
进入Fun目录下,使用g++命令动态库,也就是常见的.so文件,运行命令后就会生成一个libmath.so的文件。
g++ -fPIC -shared -o libmath.so math.cpp生成.so文件后,回到上一级目录Demo,在当前目录下通过libmath.so文件编译demo.cpp文件。
# 方法一,直接指定.so文件 g++ -o demo demo.cpp /home/long/c++/lib_so/Demo/Fun/libmath.so # 方法二,规范用法 g++ -o demo demo.cpp -L/home/long/c++/lib_so/Demo/Fun -lmath # 也可以使用相对路径 g++ -o demo demo.cpp -L./Fun -lmath在使用方法二时,需要将.so文件加入到环境变量中,这样能确保生成的程序找到对应的链接库。
# 使用动态库时不能直接用,需要将动态库加入环境变量LD_LIBRARY_PATH中 #查看环境变量 echo $LD_LIBRARY_PATH #加入环境变量 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/long/c++/lib_so/Demo/Fun方法一的运行结果
方法二的运行结果
在教程中,静态库和动态库的规范用法是一样的,如果同时存在静态库和动态库时,程序会优先使用动态库。
