DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  4737 随笔 :: 2 文章 :: 542 评论 :: 1615万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

1. realname

等同于库文件的filename,是在库文件生成时就被指定的

怎么指定库文件名,例如

(1) g++编译程序时指定realname

$ g++ -g test1.cpp -o test1.so -std=c++11

realname=test1.so

命令就是
$ g++ -g xxx.cpp -o $(realname) dependence flags 

常用的realname是带版本号的,如下

realname的一般格式为lib$(name).so.$(major).$(minor).$(revision)$(name)是动态库的名字,$(major).$(minor).$(revision)分别表示主版本号,子版本号和修正版本号。

生成命令如下:

$ g++ -g test1.cpp -shared -fPIC -o test1.so.1.1.1 -std=c++11

realname=test1.so.1.1.1

命令就是
$ g++ -g xxx.cpp -shared -fPIC -o $(realname) dependence flags

(2) 利用cmake编译makefile指定realname

在CMakeLists.txt中添加如下

add_library(<name> [STATIC | SHARED | MODULE]
            [EXCLUDE_FROM_ALL]
            [<source>...])

/****一个完成的例子如下****/
cmake_minimum_required(VERSION 3.5)
project(test1)
add_executable(test1 test1.cpp)
add_definitions(-std=c++11)
add_library(test1_library SHARED test1.cpp)
/****一个完成的例子如下****/

realname=libtest1_library.so

2. soname

在库文件生成时被指定

(1) g++编译程序时指定soname

* 其一般格式为lib$(name).so.$(major).$(minor),即lib+动态库名+.so+主版本号,soname会被写入库文件中。
* 同时指定realname和soname

$ g++ test1.cpp -shared -fPIC -Wl,-soname,libtest1.so.1.1 -o libtest1.so.1.1.1 -std=c++11

生成libtest1.so.1.1.1,使用readelf -d $(realname)查看库文件的soname

$ readelf -d libtest1.so.1.1.1

(2) 利用cmake编译makefile指定soname
使用add_library时生成的soname和realname一样

3. linkname
在链接时使用,一般格式为lib$(name).so,通常是$(realname)文件或者$(soname)文件的软链接。如

// 将linkname和realname关联起来
$ ln -s libtest1.so.1.1.1  libtest1.so

编译阶段需要的是×××.so库,需要libtest1.so存在,如果它是软链接,那么它链接的库也需要存在
运行时链接的是soname,所以libtest1.so.1.1必须存在。libtest1.so.1.1可以设置为libtest1.so.1.1.1的软链接,那么libtest1.so.1.1.1必须存在。也可以直接改名字

参考
https://blog.csdn.net/j_h_c/article/details/98375371
https://m.linuxidc.com/Linux/2016-06/132669.htm

posted on   DoubleLi  阅读(176)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2022-12-05 C ++ lambda表达式的生命周期是多少?
2022-12-05 lambda表达式捕获变量的生命周期
2012-12-05 JS脚本与服务器交互完成业务处理
2012-12-05 JSON对象和字符串之间的相互转换
点击右上角即可分享
微信分享提示