問(wèn)題描述
我編譯了一個(gè)靜態(tài)庫(kù)B山孔,它依賴了靜態(tài)庫(kù)A年碘,同時(shí)在CMakeLists.txt使用target_link_libraries(B A)
設(shè)定了B鏈接A嘲驾,但是當(dāng)我在使用B時(shí)绢要,發(fā)現(xiàn)靜態(tài)庫(kù)B中并沒(méi)有A的內(nèi)容。
B-->A
也就是說(shuō)蓄拣,cmake并沒(méi)有幫我把靜態(tài)庫(kù)A的內(nèi)容加到靜態(tài)庫(kù)B中Q镄椤!G蛐簟辜昵!
經(jīng)過(guò)查找資料,cmake確實(shí)不會(huì)合并兩個(gè)靜態(tài)庫(kù)碎捺,那么問(wèn)題來(lái)了路鹰,如何讓cmake幫我把靜態(tài)庫(kù)合并成一個(gè)贷洲。
答案
通過(guò)生成后事件收厨,自己合并。
對(duì)靜態(tài)庫(kù)的合并操作优构,windows可以通過(guò)lib.exe
程序诵叁,linux可以通過(guò)ar
和 ranlib
程序達(dá)到目的。
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并不能直接將兩個(gè).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
)
需要注意碑诉,上方代碼只是講述了原理,實(shí)際使用還需要注意文件的路徑問(wèn)題侥锦。