2015-04-17 97 views
5

我想讓我的可執行文件重新鏈接一個共享庫(libmy_so.so),而這個共享庫又由一個靜態庫(libmy_static_lib.a)構建。當我做爲什麼cmake_link_libraries包含靜態庫?

target_link_libraries(my_exe my_so) 

我看到編譯時,cmake已經在構建線上添加libmy_static_lib.a。這不是我想要的,我不明白爲什麼這是必要的。有沒有辦法解決? LINK_PRIVATE似乎沒有任何區別。

我使用CMake 2.8.9。

回答

5

CMake documentation for target_link_libraries

target_link_libraries(<target> [item1 [item2 [...]]] 
         [[debug|optimized|general] <item>] ...) 

[...] 庫的依賴默認與此簽名傳遞的。當這個目標被鏈接到另一個目標時,鏈接到這個目標的庫也將出現在另一個目標的鏈接線上。

的解決方案是使用的target_link_libraries簽名,允許手動指定傳遞行爲:

# we explicitly state that the static lib should not propagate 
# transitively to targets depending on my_so 
target_link_libraries(my_so PRIVATE my_static_lib) 

# nothing has to change for the exe 
target_link_libraries(my_exe my_so) 
+0

似乎私人不適用於CMake的2.8存在,並LINK_PRIVATE不會爲我工作。也就是說,我得到的行爲與沒有LINK_PRiVATE – Rolle

+1

@Rolle相同,這是一個至少需要CMake 2.8.11的功能。對於早期版本,我擔心你將不得不手動混淆目標屬性。如果可能,我強烈建議升級您的CMake版本。 – ComicSansMS

+0

'LINK_PRIVATE'應該可以在CMake 2.8.9下正常工作。 – steveire

相關問題