跳至主要內容

静态库开发

ekskei大约 1 分钟C/C++

静态库开发

静态库与动态库的区别

静态库:在链接时,静态库的对象文件直接加入到目标文件中,生成可执行文件。运行时不需要加载静态库。

动态库:在链接时,只有动态库的引用加入到目标文件中,生成可执行文件。运行时需要加载动态库,然后调用动态库中的函数。

静态库文件扩展名为 .a ,动态库文件扩展名为 .so (Linux)或 .dll (Windows)。

静态库在编译和链接时 resolved,动态库在运行时 resolved。

静态库会增加程序的体积,而动态库可以被多个程序共享,减小体积。

动态库可以在不重新编译程序的情况下进行更新,而静态库的更新需要重新编译链接。

静态库开发方法

  1. 编写源文件。单独编译成目标文件(.o文件)。

  2. 使用ar命令打包多个目标文件成一个库文件。

    ar rcs libxxx.a xxx1.o xxx2.o ...

  3. ranlib工具为静态库建立索引,加速链接过程。

    ranlib libxxx.a

  4. 在程序中用 -lxxx 标志链接静态库。

  5. 查看静态库包含哪些目标文件: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)