Linux动态库

3 篇文章 0 订阅

目录

1 动态库的使用

2 交付后如何使用

2 Makefile 文件生成动态库

4 库的目录结构

(5)比较:“”  <>

参考


1 动态库的使用

     交付文件是.h.so文件,同时,告之此so文件适用的平台(跨平台使用时可能会有问题)例如,目标平台: centos 6.8 64bit

//example.cpp文件
#include <stdio.h>

int example(int a, int b)
{
	printf("example library: a=%d, b=%d \n", a, b);
	return 0;
}
//example.h文件
int example(int a, int b);

使用g++命令来生成动态库。

编译生成.o文件 (编译选项 ‐fPIC )    g++ ‐c ‐fPIC example.cpp ‐o example.o
链接生成目标 .so文件 ( 链接选项 ‐shared)    g++ ‐shared example.o ‐o libexample.so
(PIC: Position Independent Code位置无关代码)
-shared:告诉g++生成的共享库而不是可执行文件

linux下动态库的规范命名:libxxx.so;前缀 lib;后缀 .so;其中 xxx是库的名称,例如 , libexample.so

使用nm libXXX.so查看库的大概内容

2 交付后如何使用

(1)交付物两个文件,.h文件内容如下:

 

(2)编写main.cpp文件

//main.cpp
#include "example.h"

int main()
{
	example(1,2);
	return 0;
}

(3)编译:g++ ‐c main.cpp ‐o main.o  正确
(4)链接:g++ main.o ‐o helloworld ‐L. ‐lexample 错误如下


解决方法,.so文件是直接复制32位系统的,要用64微系统的才可以。看当前系统的位数 shell下输入: getconf LONG_BIT

 

正确输出

链接选项说明:
         ‐lexample 使用libexample.so这个库文件
         ‐L. 指定库文件的位置,可以指定多个路径 -L. -L/test

程序的运行
         操作系统默认从标准位置寻找相应的库   /lib /usr/lib /usr/local/lib
         如果没有找到依赖的库文件,则从 LD_LIBRARY_PATH 环境变量里寻找。
         也就是说,库文件要么放在标准位置,要么放在 LD_LIBRARY_PATH 指定的位置,才能被操作系统找到。

先使用export命令设置环境变量, 然后再运行程序。
export LD_LIBRARY_PATH=
./helloworld

 

(5)显示当前环境变量

 

(6)查看依赖库  readelf ‐d helloworld

至少要知道两个基本的库:
libc.so 标准C库 (ANSI C)
libstdc++.so 标准c++库 (包含STL)
不需要在命令行中指定, g++默认会链接到这两个库

查找libc打头的文件:ls /usr/lib |grep libc  64位的没有查到,ls /usr/lib并没有发现lib...文件,因为64位需要的命令是:ls /usr/lib64  | grep libc 

 

2 Makefile 文件生成动态库

(1)在Makefile中创建动态库
(2)在动态库中使用别的动态库
(3)在动态库中共享class类型
 

增加编译选项 ‐fPIC,链接选项 ‐shared
① EXE=libexample.so
② g++ ‐shared $(CXX_OBJECTS) ‐o $(EXE)
③ g++ ‐c ‐fPIC ‐MMD $< ‐o $@

 

文件夹

Makefile

EXE=libexample.so
SUBDIR=src 
CXX_SOURCES =$(foreach dir,$(SUBDIR), $(wildcard $(dir)/*.cpp))
CXX_OBJECTS=$(patsubst  %.cpp, %.o, $(CXX_SOURCES))
DEP_FILES  =$(patsubst  %.o,  %.d, $(CXX_OBJECTS))

$(EXE): $(CXX_OBJECTS)
	g++ -shared $(CXX_OBJECTS) -o $(EXE)
	
%.o: %.cpp
	g++  -c -fPIC -MMD $<  -o  $@

-include $(DEP_FILES)

clean: 
	rm  -rf  $(CXX_OBJECTS)  $(DEP_FILES)  $(EXE)

test:
	echo $(CXX_OBJECTS)

src

example.cpp

#include <stdio.h>
#include "example.h"

int example(int a, int b)
{
	printf("example library: a=%d, b=%d \n", a, b);
	return 0;
}

void Object::Test()
{
	printf("id=%d \n", id);
}

example.h

class Object
{
public:
	void Test();
	int id;
};

int example(int a, int b);

 

make执行以后

文件夹

src

 

使用.so库文件

main.cpp

#include "src/example.h"

int main()
{
	Object obj;
	obj.id = 123;
	obj.Test();
	return 0;
}

4 库的目录结构

(1)Linux下面可能会经常使用各种库,有的是系统自带的库,有的是第三方库。通常它们的目录结构是:
libxxx/
‐ lib/
‐ include/

其中, bin下为程序, lib下为库文件, include为头文件

(2)系统自带库放在
/usr
‐include /
‐lib /

(3)文件放置

头文件:使用编译选项‐I参数来指定  g++ ‐c ‐I /home/mytest/example/include ...
库文件‐L /home/mytest/example ‐lexample‐l/home/mytest/example/libexample.so (全路径也是可以的)
 

(4)使用上面(3)目录结构中的动态库

文件

src

export  LD_LIBRARY_PATH=/home/mytest/example/lib  指定路径    mytest自己设置的用户名,例如 /home/w

main.cpp 使用<>

#include <example.h>

int main()
{
	example(1,2);
	return 0;
}

Makefile文件

EXE=helloworld
SUBDIR=src object

#CXXFLAGS:编译选项, LDFLAGS:链接选项

CXXFLAGS += -I/home/mytest/example/include/
LDFLAGS += -L/home/mytest/example/lib -lexample

CXX_SOURCES =$(foreach dir,$(SUBDIR), $(wildcard $(dir)/*.cpp))
CXX_OBJECTS=$(patsubst  %.cpp, %.o, $(CXX_SOURCES))
DEP_FILES  =$(patsubst  %.o,  %.d, $(CXX_OBJECTS))

$(EXE): $(CXX_OBJECTS)
	g++  $(CXX_OBJECTS) -o $(EXE) $(LDFLAGS)
%.o: %.cpp
	g++  -c  $(CXXFLAGS) -MMD $<  -o  $@
-include $(DEP_FILES)
clean: 
	rm  -rf  $(CXX_OBJECTS)  $(DEP_FILES)  $(EXE)
test:
	echo $(CXX_OBJECTS)

(5)比较:“”  <>

#include <example.h>
#include "example.h"
<example.h> : 仅从INCLUDE路径里查找此头文件
"example.h" : 从当前目录下查找,如果不存在,从INCLUDE路径里查找。
用‐I选项来指定自定义的INCLUDE路径。标准INCLUDE路径 : /usr/include /usr/local/include

参考

阿发你好视频教程

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值