cmake制作动态库和静态库
linux动态库--so
windows动态库--dll
linux静态库--a
windows静态库--lib
add_library(库名 STATIC|SHARED 源文件......)
动态库有可执行权限
静态库没有可执行权限
没有利用的源文件,表示只需要建立这个库文件。
没有指定库的类型默认生成静态库。
格式
add_library(<name> <SHARED|STATIC|MODULE|OBJECT|UNKNOWN> IMPORTED [GLOBAL])
参数
<name>:库的名称。这个名称用于在其他地方引用这个库。
指定库的类型:
<SHARED>:指定创建一个共享库(动态库)。
<STATIC>:指定创建一个静态库。
<MODULE>:指定创建一个模块库,这种库不应该作为可链接的库。
<OBJECT>:指定创建一个对象库,这个库不会生成任何文件,但可以在其他库或可执行文件中使用。
<UNKNOWN>:表示库的类型未知。
库的属性:
IMPORTED:表示这个库是一个外部库(可能在其他项目或系统中已经存在),告诉CMake不要尝试构建生成这个库。
[GLOBAL]:可选参数,如果指定,表示这个库是全局可见的。
指定库的生产路径
因为动态库具有可执行权限,动态库可以用两个系统变量指定生成的路径:
EXECUTABLE_OUTPUT_PATH,LIBRARY_OUT_PATH;
静态库只能用后面一个。
静态库的生成
库的生成至少需要指定两个东西:
1,头文件路径(因为源文件中包含头文件了);
2,源文件;
如果不指定生成的类型,默认生成静态库。
动态库的生成
和静态库一样,只需要改变生成的类型关键字就行。
怎么使用库文件
源文件是文本格式,库文件是二进制格式。
库的使用
需要库和头文件
要形成良好的编程习惯,静态库和动态库不要放在一个目录下,否则如果静态库和动态库同名,引用库会出现问题。
使用静态库
link_librairys()
一个类型的参数,可以有多个参数
库文件中含有源文件定义的内容,生成可执行文件我们需要指定的有两个文件:
1,头文件路径(如果在当前目录不需要指定);
2,库文件(及其路径);
系统提供的库只需要提供库名;
自定义的库还需要指定路径;
指定库的路径
link_directories()
注意:这个函数只是用来指定静态库和动态库路径的,不指定库。
多个库就指定多个路径。
使用动态库
target_link_librairies()
两个类型的参数
动态库加载的位置
动态库的链接应该写生成可执行文件之后,因为只有可执行程序调用动态库,动态库才会被加载到内存,而不是像静态库一样生成可执行程序的过程就需要加载静态库一起打包。
target_link_library多次加载动态库需统一链接权限风格问题
动态库的访问权限
默认情况下,库的链接是具有传递性的。
public 默认;
private 会断层,只能单层继承;
interface 跨越库使用
使用静态库和动态库的区别
静态库文件会放入可执行程序文件,执行前链接静态库文件;
动态库不会 ,执行时需要才去加载和链接动态库;
库的建立到使用
建立---链接
什么东西需要生成库文件
源文件
生成库文件之后怎么用
头文件,库文件。
项目如何链接动态库
1,动态库已经通过find_package找到,而且通过target_link_libraries()链接到可执行文件,编译没有问题,但是运行是报错,提示没有找到动态库;
list(APPEND CMAKE_MODULE_PATH "${path_to_third_party}/basic_hunk/lib/cmake")
find_package(BasicHunk MODULE REQUIRED)
target_link_libraries(handeye_exec
basic_hunk::basic_hunk)
通过ldd查看,这个库没有找到:
首先target_link_libraries的本质是什么?
查看target的库链接情况的指令
ldd
ldd是什么
就一个shell脚本文件。
作用
`ldd` 是 `list dynamic dependencies` 的缩写。`ldd` 命令用于列出可执行文件或共享库依赖的动态链接库以及它们的加载地址等信息。
使用
ldd --help
Usage: ldd [OPTION]... FILE...
--help print this help and exit
--version print version information and exit
-d, --data-relocs process data relocations
-r, --function-relocs process data and function relocations
-u, --unused print unused direct dependencies
-v, --verbose print all information
ldd install/handeye_calibration/lib/handeye_calibration/handeye_calib_exec
readelf
readelf是什么
不像ldd是一个shell脚本,readelf是一个命令工具。
作用
通过使用 `readelf` 命令,可以了解可执行文件或共享库的编译和链接信息,包括所链接的库、库搜索路径、可重定位的函数和变量信息,还可以检查 ELF 文件的完整性和一致性。
elf
ELF 是一种常见的二进制可执行文件格式,包括可移植可执行文件,共享库,内核二进制文件等,被广泛应用于 Unix 和 Linux 系统。
使用
readelf -d file