静态库开发
大约 1 分钟
静态库开发
静态库与动态库的区别
静态库:在链接时,静态库的对象文件直接加入到目标文件中,生成可执行文件。运行时不需要加载静态库。
动态库:在链接时,只有动态库的引用加入到目标文件中,生成可执行文件。运行时需要加载动态库,然后调用动态库中的函数。
静态库文件扩展名为 .a ,动态库文件扩展名为 .so (Linux)或 .dll (Windows)。
静态库在编译和链接时 resolved,动态库在运行时 resolved。
静态库会增加程序的体积,而动态库可以被多个程序共享,减小体积。
动态库可以在不重新编译程序的情况下进行更新,而静态库的更新需要重新编译链接。
静态库开发方法
编写源文件。单独编译成目标文件(.o文件)。
使用ar命令打包多个目标文件成一个库文件。
ar rcs libxxx.a xxx1.o xxx2.o ...
ranlib工具为静态库建立索引,加速链接过程。
ranlib libxxx.a
在程序中用 -lxxx 标志链接静态库。
查看静态库包含哪些目标文件:ar -t libxxx.a
使用CMake构建静态库
指定库的名称
add_library(xxx STATIC xxx1.c xxx2.c ...)
生成静态库libxxx.a
set_target_properties(xxx PROPERTIES OUTPUT_NAME "xxx")
手动指定库文件名
set_target_properties(xxx PROPERTIES PREFIX "lib" SUFFIX ".a" OUTPUT_NAME "xxx")
去掉库文件名前缀
set_target_properties(xxx PROPERTIES PREFIX "")
把静态库放进动态库
target_link_libraries(xxx -Wl,--whole-archive libmmm.a libnnn.a -Wl,--no-whole-archive)