动态库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