一、概述
有时候我们创建windows的Dll或者Linux下的So库时候,在已经生成的产物里面我们又不想重新修改工程来修改我们动态库的名字,这个应该怎么做呢,windows跟linux两个平台使用的工具不一样。比如我们有一个TestA.Dll和TestA.lib或者 TestA.so
二、知识准备
1)windows下的def文件
概念: 动态链接库(DLL)的模块定义文件,用于在编译和链接阶段指定DLL导出函数的名称和地址
作用: 1、指定DLL导出函数的名称和地址。在.def文件中,您可以指定哪些函数应该导出,并为它们指定名称和地址。这些导出函数可以被其他程序或DLL调用,并且可以通过GetProcAddress函数获取它们的地址。
2、定义DLL导出函数的调用约定。在.def文件中,您可以指定导出函数使用的调用约定,如__stdcall、__cdecl等。这些调用约定规定了函数参数如何传递以及函数返回值如何处理。
3、 管理DLL的版本和兼容性。在.def文件中,您可以指定DLL的版本号以及与其他DLL的兼容性。这有助于确保程序在升级或修改DLL时不会出现兼容性问题或冲突。
使用场景: dll中没有在函数前面加入declspec(dllexport),需要把.def导入到VS中进行编译,否则无需使用
三、详细操作
1、windows平台
windows下生成dll时产生了lib文件
概念:lib文件被称为导入库(Import Library),它包含了DLL中导出函数的符号(Symbol)和地址,用于链接DLL的文件
作用: 动态链接库(DLL)需要一个导入库文件(.lib)来与静态链接器(linker)交互。当一个应用程序使用一个DLL时,它需要知道如何访问DLL中的函数。这些函数在编译时并不是直接链接到应用程序中的,而是在运行时从DLL中加载。为了使应用程序能够正确地调用DLL中的函数,需要一个导入库文件来告诉链接器如何在运行时定位和调用DLL中的函数。因此,在生成DLL时需要生成一个导入库文件(.lib)
操作命令步骤:
1)先利用pexports.exe生成def文件
pexports.exe TestA.dll > libCccA.def
2)打开libCccA.def 文件
把文件内容首行把TestA 改为 libCccA
3)用vs2019或者2022的命令行工具执行 生成.lib文件
lib /def:libCccA.def /machine:X86 /out:libCccA.lib
vs最后直接把TestA.dll手动改名为libCccA.dll即可
2、linux平台修改so的名称(把libTestA.so 改为libCccA.so)
1) 先安装patchself工具
centos下安装 yum install pathself
ubutu下安装aptget install pathself
2)执行命令
patchelf --set-soname libTestA.so libCccA.so
参考csdn链接修改linux下so动态库的soname_修改so的soname-CSDN博客