静态库与动态库

  1. 静态函数库
  2. 这类库的名字一般是libxxx.axxx为库的名字。利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。
  3.  
  4. 动态函数库
  5. 这类库的名字一般是libxxx.M.N.so,同样的xxx为库的名字,M是库的主版本号,N是库的副版本号。当然也可以不要版本号,但名字必须有。相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib

1. 生成动态库并调用

创建文件,用于生成.so

  1. // add.h
  2. #include<iostream>
  3. int add(int a,int b);
  4.  
  5. //add.cpp
  6. #include "add.h"
  7. int add(int a, int b)
  8. {
  9. return a+b;
  10. }
  11.  
  12. // hello.h
  13. #include<iostream>
  14.  
  15. using namespace std;
  16.  
  17. void hello();
  18. // hello.cpp
  19. #include"hello.h"
  20.  
  21. using namespace std;
  22.  
  23. void hello()
  24. {
  25.  
  26. cout << "Hello World!!"<<endl;
  27. }

创建main.cpp 调用.so文件

  1. #include"add.h"
  2. #include"hello.h"
  3.  
  4. using namespace std;
  5.  
  6. int main(int argc,char *argv[])
  7. {
  8. int a = 20;
  9. int b = 30;
  10. cout << "a + b = " << add(a,b)<< endl;
  11. hello();
  12. return 0;
  13. }

******利用cmake生成so文件 并调用*******

首先在当前目录下创建CMakeLists.txt

  1. # CMakeLists.txt
  2. cmake_minimum_required(VERSION 2.8)
  3. project(MySharedLib)
  4. # C++ 编译
  5. set(CMAKE_CXX_STANDARD )
  6. #创建共享库
  7. add_library(MyTest SHARED add.cpp hello.cpp)
    #add_library该指令的主要作用就是将指定的源文件生成链接文件 SHARED库会被动态链接(动态链接库)

进入build文件夹下执行cmake .. make 即可生成.so文件

开始测试so文件,在新文件夹下创建include、lib和build文件 创建main.cpp  将add.h hello.h 放入include文件夹 libMyTest.so 放入lib文件夹下,创建CMakeLists.txt

  1. # CMakeLists.txt
  2. cmake_minimum_required(VERSION 2.8)
  3.  
  4. #项目名:test
  5. project(main)
  6.  
  7. # C++ 编译
  8. set(CMAKE_CXX_STANDARD )
  9.  
  10. # 指定头文件路径
  11. set(INC_DIR /home/wangxiaobei/Software/TryMakeSo/test_so/include)
  12.  
  13. # 库文件路径 指定静态和动态文件目录
  14. set(LIB_DIR /home/wangxiaobei/Software/TryMakeSo/test_so/lib)
  15.  
  16. #指定头文件目录
  17. include_directories(${INC_DIR})
  18.  
  19. #链接库路径
  20. link_directories(${LIB_DIR})
  21.  
  22. #链接库,MySharedLib为库名
  23. link_libraries(MyTest)
  24.  
  25. #生成目标文件
  26. add_executable(c_main main.cpp)
  27.  
  28. # 链接 库文件 MySharedLib 库
  29. target_link_libraries(c_main MyTest)

进入build 执行cmake ..      make   则生成可执行文件c_main

******利用g++生成so 并调用*******

执行g++ add.cpp hello.cpp -fPIC -shared -o libtest.so 将两个.cpp文件生成 test.so 文件

创建main.cpp 调用.so文件

  1. #include"add.h"
  2. #include"hello.h"
  3.  
  4. using namespace std;
  5.  
  6. int main(int argc,char *argv[])
  7. {
  8. int a = ;
  9. int b = ;
  10. cout << "a + b = " << add(a,b)<< endl;
  11. hello();
  12. return ;
  13. }

g++ main.cpp -L. -ltest -o main

-L参数:指明要链接的so库所在路径(如-L. 表示当前路径, -L../so 表示当前路径的上一层目录的so子文件夹中)

-l参数:指明要连接的库的名字,如-ltest 表示要链接libtest.so库

直接运行会报错 因为没有链接到.so文件,需要在./mian之前告诉so文件的位置 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./libtest

【参考博文】致谢

https://blog.csdn.net/cindywry/article/details/86063930

https://blog.csdn.net/bigdog_1027/article/details/79113342

Linux下的静态库与动态库的生成与调用的更多相关文章

  1. Linux 下的静态(函数)库、动态(函数)库

    0. 基本 在命名上,静态库的名字一般是 libxxx.a,动态库的名字一般是 libxxx.so,有时 libxxx.so.major.minor,xxx 是该 lib 的名字,major 是主版本 ...

  2. linux下添加动态链接库路径、动态库加载等方法

    linux下添加动态链接库路径的方法 2017年01月20日 10:08:17 阅读数:5596   Linux共享库路径配置 Linux下找不到共享库文件的典型现象为明明已经安装某个软包(如libn ...

  3. linux下项目开发加载动态库:ldconfig与 /etc/ld.so.conf

    场景:自己开发一个项目,程序里包含一些自定义动态库.运行,需要加载这些动态库. 假如这些库在/pro/output/lib/下面,可执行程序在/pro/output/bin/下面. 那么,我们需要: ...

  4. Linux下Gcc生成和使用静态库和动态库详解(转)

    一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同( ...

  5. 在Linux下如何使用GCC编译程序、简单生成 静态库及动态库

      最近在编写的一个Apache  kafka 的C/C++客户端,,在看他写的 example中,他的编译是用librdkafka++.a和librdkafka.a    静态库编译的,,,而我们这 ...

  6. Linux下Gcc生成和使用静态库和动态库详解

    参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库 ...

  7. [转]Linux下用gcc/g++生成静态库和动态库(Z)

    Linux下用gcc/g++生成静态库和动态库(Z) 2012-07-24 16:45:10|  分类: linux |  标签:链接库  linux  g++  gcc  |举报|字号 订阅     ...

  8. linux下的共享库(动态库)和静态库

    1.什么是库在windows平台和linux平台下都大量存在着库.本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和linux的本质不同,因此二者库的二进制是不 ...

  9. 【转】Linux下gcc生成和使用静态库和动态库详解

    一.基本概念 1.1 什么是库 在Windows平台和Linux平台下都大量存在着库. 本质上来说,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不 ...

  10. (笔记)Linux下的静态库和动态库使用详解

    库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 一.静态库和动态库的区别 1. 静态函数库 这类库的名字一般是libxxx.a:利用静态函数库编译成的文件比 ...

随机推荐

  1. 在application-context.xml中配置多个property-placeholder

    如下所示,直接写多个<context:property-placeholder>标签是会报错的. <context:property-placeholder location=&qu ...

  2. 如何利用awk累加第一列的值?

    以下是一个五行文件的例子: 1.[root@master yjt]# seq 5 |awk 'BEGIN{sum=0;print "总和:"}{if(NR<=4)printf ...

  3. Tkinter 之MessageBox弹出框

    一.参数说明 语法 作用 截图 tk.messagebox.showwarning(title='提示', message='你确定要删除吗?') 警告信息弹窗   tk.messagebox.sho ...

  4. ICEM-三棱锥的一种画法(2D转3D)

    原视频下载地址:https://yunpan.cn/cqwC3eZHn5AvJ  访问密码 9456

  5. 如何从DOS命令窗口进行复制粘贴

    在DOS窗口没有右键复制按钮,那我们如果想要进行复制粘贴该如何操作呢?本篇就来说明一下这个操作流程. 工具/原料   WIN7系统 方法/步骤     按“WIN+R”调出运行页面,在其中输入CMD然 ...

  6. JMeter_控制器执行效果_给自己挖过的坑

    线程及循环设置: 数据文件中放在“循环控制器”中的执行效果:每条数据执行5次,取够50条数据时停止 简单逻辑控制器按下面的目录创建后,执行结果效果同上面循环控制器的执行效果 本来想规整下目录结构,结果 ...

  7. C#-片段-插入片段:Visual C#

    ylbtech-C#-片段-插入片段:Visual C# 1.返回顶部 ·#if #if true #endif ·#region #region MyRegion #endregion · 2.返回 ...

  8. 画布之ShapeDrawable

    package com.loaderman.customviewdemo; import android.content.Context; import android.graphics.Canvas ...

  9. Facebook libra开发者文档- 2 -Libra Protocol: Key Concepts核心概念

    Libra Protocol: Key Concepts https://developers.libra.org/docs/libra-protocol Libra区块链是一个加密认证的分布式数据库 ...

  10. Spring MVC Action参数类型 List集合类型(简单案例)

    题目:定义一个员工实体(Employee),实现批量添加员工功能,在表单中可以一次添加多个员工,数据可以不持久化 1,新建一个项目 2, 然后选择Maven框架选择 maven-archetype-w ...