Linux下的静态库与动态库的生成与调用
静态库与动态库
静态函数库
这类库的名字一般是libxxx.a,xxx为库的名字。利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。 动态函数库
这类库的名字一般是libxxx.M.N.so,同样的xxx为库的名字,M是库的主版本号,N是库的副版本号。当然也可以不要版本号,但名字必须有。相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib。
1. 生成动态库并调用
创建文件,用于生成.so
// add.h
#include<iostream>
int add(int a,int b); //add.cpp
#include "add.h"
int add(int a, int b)
{
return a+b;
} // hello.h
#include<iostream> using namespace std; void hello();
// hello.cpp
#include"hello.h" using namespace std; void hello()
{ cout << "Hello World!!"<<endl;
}
创建main.cpp 调用.so文件
#include"add.h"
#include"hello.h" using namespace std; int main(int argc,char *argv[])
{
int a = 20;
int b = 30;
cout << "a + b = " << add(a,b)<< endl;
hello();
return 0;
}
******利用cmake生成so文件 并调用*******
首先在当前目录下创建CMakeLists.txt
# CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(MySharedLib)
# C++ 编译
set(CMAKE_CXX_STANDARD )
#创建共享库
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
# CMakeLists.txt
cmake_minimum_required(VERSION 2.8) #项目名:test
project(main) # C++ 编译
set(CMAKE_CXX_STANDARD ) # 指定头文件路径
set(INC_DIR /home/wangxiaobei/Software/TryMakeSo/test_so/include) # 库文件路径 指定静态和动态文件目录
set(LIB_DIR /home/wangxiaobei/Software/TryMakeSo/test_so/lib) #指定头文件目录
include_directories(${INC_DIR}) #链接库路径
link_directories(${LIB_DIR}) #链接库,MySharedLib为库名
link_libraries(MyTest) #生成目标文件
add_executable(c_main main.cpp) # 链接 库文件 MySharedLib 库
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文件
#include"add.h"
#include"hello.h" using namespace std; int main(int argc,char *argv[])
{
int a = ;
int b = ;
cout << "a + b = " << add(a,b)<< endl;
hello();
return ;
}
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下的静态库与动态库的生成与调用的更多相关文章
- Linux 下的静态(函数)库、动态(函数)库
0. 基本 在命名上,静态库的名字一般是 libxxx.a,动态库的名字一般是 libxxx.so,有时 libxxx.so.major.minor,xxx 是该 lib 的名字,major 是主版本 ...
- linux下添加动态链接库路径、动态库加载等方法
linux下添加动态链接库路径的方法 2017年01月20日 10:08:17 阅读数:5596 Linux共享库路径配置 Linux下找不到共享库文件的典型现象为明明已经安装某个软包(如libn ...
- linux下项目开发加载动态库:ldconfig与 /etc/ld.so.conf
场景:自己开发一个项目,程序里包含一些自定义动态库.运行,需要加载这些动态库. 假如这些库在/pro/output/lib/下面,可执行程序在/pro/output/bin/下面. 那么,我们需要: ...
- Linux下Gcc生成和使用静态库和动态库详解(转)
一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同( ...
- 在Linux下如何使用GCC编译程序、简单生成 静态库及动态库
最近在编写的一个Apache kafka 的C/C++客户端,,在看他写的 example中,他的编译是用librdkafka++.a和librdkafka.a 静态库编译的,,,而我们这 ...
- Linux下Gcc生成和使用静态库和动态库详解
参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库 ...
- [转]Linux下用gcc/g++生成静态库和动态库(Z)
Linux下用gcc/g++生成静态库和动态库(Z) 2012-07-24 16:45:10| 分类: linux | 标签:链接库 linux g++ gcc |举报|字号 订阅 ...
- linux下的共享库(动态库)和静态库
1.什么是库在windows平台和linux平台下都大量存在着库.本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和linux的本质不同,因此二者库的二进制是不 ...
- 【转】Linux下gcc生成和使用静态库和动态库详解
一.基本概念 1.1 什么是库 在Windows平台和Linux平台下都大量存在着库. 本质上来说,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不 ...
- (笔记)Linux下的静态库和动态库使用详解
库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 一.静态库和动态库的区别 1. 静态函数库 这类库的名字一般是libxxx.a:利用静态函数库编译成的文件比 ...
随机推荐
- java四种对象引用类型
java四种对象引用类型 对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序 ...
- ListView中的Item不能点击的解决方法
有时,为了实现某种功能,在Android程序中会考虑在ListView的每一个Item中添加一个Button(或ImageButton等). 但是,这样会出现一个问题: 当同时设置了Button的on ...
- C#实现获取当前文件路径的上级路径
界面: 声明: textBox1.Text为指定文件路径:string path = @"F:\ABB-pragram\ABB工作站\ABB Station\Systems\Situatio ...
- Linux中split大文件分割和cat合并文件
当需要将较大的数据上传到服务器,或从服务器下载较大的日志文件时,往往会因为网络或其它原因而导致传输中断而不得不重新传输.这种情况下,可以先将大文件分割成小文件后分批传输,传完后再合并文件. 1.分割 ...
- 【Oracle】往Oracle11g的某表插入近千万条记录,耗时略超一小时
和MySql的对比下,两者有数量级的差距. 表ddl: CREATE TABLE tb04 ( "ID" ,) not null primary key, "NAME&q ...
- 阿里巴巴高可用技术专家襄玲:压测环境的设计和搭建 PTS - 襄玲 云栖社区 今天
阿里巴巴高可用技术专家襄玲:压测环境的设计和搭建 PTS - 襄玲 云栖社区 今天
- [Java复习] MQ
1. 为什么要用MQ? 解耦,异步,削峰 2. MQ的优点和缺点? 优点: 解耦.异步.削峰 缺点: 1. 系统可用性降低. 外部依赖越多,越容易挂.如果MQ挂了,怎么处理? 2. 系统复杂度提高. ...
- Chrome 浏览器自动填表呈现淡黄色解决
Chrome 浏览器,当记住用户名和密码后,下次填写表单时,被记住的部分会被填充为淡黄色,有些时候不好看. 解决方式如下: input:-webkit-autofill { -webki ...
- QML小例子【QML工程里信号与槽】
1.效果 代码参考B站视频:https://www.bilibili.com/video/av36584062 功能:点击左边,会发出信号,右边会有个颜色动画,然后计数+1 2.分析: 一共有两个对象 ...
- Django——models中导入数据重复的解决办法
如果你导入数据过多,导入时出错了,或者你手动停止了,导入了一部分,还有一部分没有导入.或者你再次运行上面的命令,你会发现数据重复了,怎么办呢? django.db.models 中还有一个函数叫 ge ...