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

Linux下g++编译与使用静态库和动态库

程序员文章站 2022-06-04 13:24:22
...

    在windows环境下,我们通常在IDE如VS的工程中开发C++项目,对于生成和使用静态库(*.lib)与动态库(*.dll)可能都已经比较熟悉,但是,在Linux环境下,则是另一套模式,对应的静态库(*.a)与动态库(*.so)的生成与使用方式是不同的。刚开始可能会不适应,但是用多了应该会习惯这种使用,因为步骤上并没有VS下配置那么繁琐。下面就分别总结下linux下生成并使用静态库与动态库的方法:(由于是C++项目,所以编译器用的g++,但是与gcc的使用是相通的)


   首先是准备工作,把我们需要封装成库文件的函数的头文件与源文件写好,如下:

  1. //myAPI.h  
  2. int ADD(int a, int b);  
  3. int MINUS(int a, int b);  
Linux下g++编译与使用静态库和动态库
//myAPI.h
int ADD(int a, int b);
int MINUS(int a, int b);

  1. //myAPI.cpp  
  2. #include "myAPI.h"  
  3.   
  4. int ADD(int a, int b){  
  5.     return a + b;  
  6. }  
  7.   
  8. int MINUS(int a, int b){  
  9.     return a - b;  
  10. }  
Linux下g++编译与使用静态库和动态库
//myAPI.cpp
#include "myAPI.h"

int ADD(int a, int b){
    return a + b;
}

int MINUS(int a, int b){
    return a - b;
}

接下来准备一个测试用的主函数源文件:

  1. //main.cpp  
  2. #include "myAPI.h"  
  3. #include <iostream>  
  4.   
  5. int main(){  
  6.     std::cout << "1 + 1 = " << ADD(1, 1) << std::endl;  
  7.     std::cout << "1 - 1 = " << MINUS(1, 1) << std::endl;  
  8.     return 0;  
  9. }  
Linux下g++编译与使用静态库和动态库
//main.cpp
#include "myAPI.h"
#include <iostream>

int main(){
    std::cout << "1 + 1 = " << ADD(1, 1) << std::endl;
    std::cout << "1 - 1 = " << MINUS(1, 1) << std::endl;
    return 0;
}


最后,先编译我们的 myAPI.cpp 文件生成 myAPI.o 目标文件

  1. g++ -c myAPI.cpp  
Linux下g++编译与使用静态库和动态库
g++ -c myAPI.cpp

1.生成静态库并使用

    linux下用生成静态库的命令 ar 处理 myAPI.o 文件生成静态库文件,生成的库文件应遵循规范,及linux下库文件加“lib”前缀。所以针对本例,通过如下一条命令即可生成 libmyAPI.a 静态库:

  1. ar crv libmyAPI.a myAPI.o  
Linux下g++编译与使用静态库和动态库
ar crv libmyAPI.a myAPI.o

接下来即可在项目编译过程中利用静态库了,此时 myAPI.cpp 这个库函数的定义文件已经不需要了。main.cpp 编译命令如***意,依赖的静态库文件要放在被依赖项后面):

  1. g++ main.cpp libmyAPI.a -o output  
Linux下g++编译与使用静态库和动态库
g++ main.cpp libmyAPI.a -o output

编译通过后即可运行可执行文件 output , 此时 libmyAPI.a 也已经是不需要的了。执行命令并输出结果如下:

  1. ./output  
Linux下g++编译与使用静态库和动态库
./output

Linux下g++编译与使用静态库和动态库

2.生成动态库并使用

    linux下编译时通过 -shared 参数可以生成动态库(.so)文件,如下

  1. g++ -shared -fPIC -o libmyAPI.so myAPI.o  
Linux下g++编译与使用静态库和动态库
 g++ -shared -fPIC -o libmyAPI.so myAPI.o

生成的动态库在编译时需要声明,运行时需要被依赖。声明如下

  1. g++ main.cpp -L. -lmyAPI -o output   
Linux下g++编译与使用静态库和动态库
g++ main.cpp -L. -lmyAPI -o output 

”-L.”标记告诉G++函数库可能位于当前目录;使用”-lmyAPI”标记来告诉G++驱动程序在连接阶段引用共享函数库libmyAPI.so。

使用时如果提示如下错误,则将 libmyAPI.so 移到 /usr/lib 目录下即可:

  1. ./output  
Linux下g++编译与使用静态库和动态库
./output

Linux下g++编译与使用静态库和动态库

Linux下g++编译与使用静态库和动态库




    在windows环境下,我们通常在IDE如VS的工程中开发C++项目,对于生成和使用静态库(*.lib)与动态库(*.dll)可能都已经比较熟悉,但是,在Linux环境下,则是另一套模式,对应的静态库(*.a)与动态库(*.so)的生成与使用方式是不同的。刚开始可能会不适应,但是用多了应该会习惯这种使用,因为步骤上并没有VS下配置那么繁琐。下面就分别总结下linux下生成并使用静态库与动态库的方法:(由于是C++项目,所以编译器用的g++,但是与gcc的使用是相通的)


   首先是准备工作,把我们需要封装成库文件的函数的头文件与源文件写好,如下:

  1. //myAPI.h  
  2. int ADD(int a, int b);  
  3. int MINUS(int a, int b);  
Linux下g++编译与使用静态库和动态库
//myAPI.h
int ADD(int a, int b);
int MINUS(int a, int b);

  1. //myAPI.cpp  
  2. #include "myAPI.h"  
  3.   
  4. int ADD(int a, int b){  
  5.     return a + b;  
  6. }  
  7.   
  8. int MINUS(int a, int b){  
  9.     return a - b;  
  10. }  
Linux下g++编译与使用静态库和动态库
//myAPI.cpp
#include "myAPI.h"

int ADD(int a, int b){
    return a + b;
}

int MINUS(int a, int b){
    return a - b;
}

接下来准备一个测试用的主函数源文件:

  1. //main.cpp  
  2. #include "myAPI.h"  
  3. #include <iostream>  
  4.   
  5. int main(){  
  6.     std::cout << "1 + 1 = " << ADD(1, 1) << std::endl;  
  7.     std::cout << "1 - 1 = " << MINUS(1, 1) << std::endl;  
  8.     return 0;  
  9. }  
Linux下g++编译与使用静态库和动态库
//main.cpp
#include "myAPI.h"
#include <iostream>

int main(){
    std::cout << "1 + 1 = " << ADD(1, 1) << std::endl;
    std::cout << "1 - 1 = " << MINUS(1, 1) << std::endl;
    return 0;
}


最后,先编译我们的 myAPI.cpp 文件生成 myAPI.o 目标文件

  1. g++ -c myAPI.cpp  
Linux下g++编译与使用静态库和动态库
g++ -c myAPI.cpp

1.生成静态库并使用

    linux下用生成静态库的命令 ar 处理 myAPI.o 文件生成静态库文件,生成的库文件应遵循规范,及linux下库文件加“lib”前缀。所以针对本例,通过如下一条命令即可生成 libmyAPI.a 静态库:

  1. ar crv libmyAPI.a myAPI.o  
Linux下g++编译与使用静态库和动态库
ar crv libmyAPI.a myAPI.o

接下来即可在项目编译过程中利用静态库了,此时 myAPI.cpp 这个库函数的定义文件已经不需要了。main.cpp 编译命令如***意,依赖的静态库文件要放在被依赖项后面):

  1. g++ main.cpp libmyAPI.a -o output  
Linux下g++编译与使用静态库和动态库
g++ main.cpp libmyAPI.a -o output

编译通过后即可运行可执行文件 output , 此时 libmyAPI.a 也已经是不需要的了。执行命令并输出结果如下:

  1. ./output  
Linux下g++编译与使用静态库和动态库
./output

Linux下g++编译与使用静态库和动态库

2.生成动态库并使用

    linux下编译时通过 -shared 参数可以生成动态库(.so)文件,如下

  1. g++ -shared -fPIC -o libmyAPI.so myAPI.o  
Linux下g++编译与使用静态库和动态库
 g++ -shared -fPIC -o libmyAPI.so myAPI.o

生成的动态库在编译时需要声明,运行时需要被依赖。声明如下

  1. g++ main.cpp -L. -lmyAPI -o output   
Linux下g++编译与使用静态库和动态库
g++ main.cpp -L. -lmyAPI -o output 

”-L.”标记告诉G++函数库可能位于当前目录;使用”-lmyAPI”标记来告诉G++驱动程序在连接阶段引用共享函数库libmyAPI.so。

使用时如果提示如下错误,则将 libmyAPI.so 移到 /usr/lib 目录下即可:

  1. ./output  
Linux下g++编译与使用静态库和动态库
./output

Linux下g++编译与使用静态库和动态库

Linux下g++编译与使用静态库和动态库