CMake 合并静态库 | C & C++
本文转载自《Cmake 静态库链接静态库》,原文有删改。
问题
一个静态库 B 依赖了静态库 A,同时在 CMakeLists.txt 使用 target_link_libraries(B A)
设定了 B 链接 A,但是在使用 B 时,发现静态库 B 中并没有 A 的符号。也就是说,cmake 并没有帮我把静态库 A 的符号添加到静态库 B 中。
实际上,cmake 确实不会合并两个静态库,那么才能如何让 cmake 真正做到静态库呢。
答案
通过生成后事件,自己合并。
Windows
1 | add_custom_command(TARGET example_lib POST_BUILD |
Linux
ar 程序并不能直接将两个 .a 文件合并,必须先把 .a 拆成 .o 文件,再把所有 .o 文件合并在一起
1 | add_custom_command(TARGET examplelib POST_BUILD |
macOS
macOS 则提供了 libtool 这个工具,可以直接合并静态库。
1 | add_custom_command(TARGET examplelib POST_BUILD |
CMake 合并静态库 | C & C++