动态库realname、soname和linkname

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 2021-06-11 11:01  JJ_S  阅读(1096)  评论(0编辑  收藏  举报