问题描述
我编译了一个静态库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可以通过ar
和 ranlib
程序达到目的。
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
)
需要注意,上方代码只是讲述了原理,实际使用还需要注意文件的路径问题。