linux 动态库生成与调用,Linux下的静态库与动态库的生成与调用

静态库与动态库

静态函数库

这类库的名字一般是libxxx.a,xxx为库的名字。利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。

动态函数库

这类库的名字一般是libxxx.M.N.so,同样的xxx为库的名字,M是库的主版本号,N是库的副版本号。当然也可以不要版本号,但名字必须有。相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib。

1. 生成动态库并调用

创建文件,用于生成.so

//add.h

#include

int add(int a,intb);//add.cpp

#include "add.h"

int add(int a, intb)

{return a+b;

}//hello.h

#include

using namespacestd;voidhello();//hello.cpp

#include"hello.h"

using namespacestd;voidhello()

{

cout<< "Hello World!!"<

}

创建main.cpp 调用.so文件

#include"add.h"#include"hello.h"

using namespacestd;

int main(int argc,char *argv[])

{

int a = 20;

int b = 30; cout << "a + b = " << add(a,b)<

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

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

# CMakeLists.txt

cmake_minimum_required(VERSION2.8)

project(MySharedLib)

# C++11编译set(CMAKE_CXX_STANDARD 11)

#创建共享库

add_library(MyTest SHARED add.cpp hello.cpp)

#add_library该指令的主要作用就是将指定的源文件生成链接文件 SHARED库会被动态链接(动态链接库)

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

996f64454c9a8f76af09fc200c571fec.png

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

# CMakeLists.txt

cmake_minimum_required(VERSION2.8)

#项目名:test

project(main)

# C++11编译set(CMAKE_CXX_STANDARD 11)

# 指定头文件路径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

11285ef7504d9dc8ee3a3861e273013f.png

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

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

242e1c7d028cf85f36402b7ed4096747.png

创建main.cpp 调用.so文件

#include"add.h"#include"hello.h"

using namespacestd;int main(int argc,char *argv[])

{int a = 20;int b = 30;

cout<< "a + b =" << add(a,b)<

hello();return 0;

}

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

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

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

f5e7ae371e98b1c729cd3ba1ae35df74.png

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

【参考博文】致谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值