Cmake 静态库链接静态库

问题描述

我编译了一个静态库B,它依赖了静态库A,同时在CMakeLists.txt使用target_link_libraries(B A) 设定了B链接A,但是当我在使用B时,发现静态库B中并没有A的内容。

B-->A

也就是说,cmake并没有帮我把静态库A的内容加到静态库B中!!!!

经过查找资料,cmake确实不会合并两个静态库,那么问题来了,如何让cmake帮我把静态库合并成一个。

答案

通过生成后事件,自己合并。

对静态库的合并操作,windows可以通过lib.exe程序,linux可以通过arranlib程序达到目的。

windows下:

add_custom_command(TARGET examplelib POST_BUILD
                            COMMAND lib.exe /out:tmp.lib B.lib A.lib
                            COMMAND ${CMAKE_COMMAND} -E rename tmp.lib B.lib
                            )
                            

linux下:
linux并不能直接将两个.a文件合并,必须先把.a拆成.o文件,再把所有.o文件合并在一起

add_custom_command(TARGET examplelib POST_BUILD
                            COMMAND ar x libA.a
                            COMMAND ar x libB.a
                            COMMAND ar cru libB.a *.o
                            COMMAND ranlib libB.a
                            )

需要注意,上方代码只是讲述了原理,实际使用还需要注意文件的路径问题。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容