動態庫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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章