2015-04-17 13 views
5

Chcę, aby mój plik wykonywalny łączył bibliotekę współużytkowaną (libmy_so.so), która z kolei została zbudowana za pomocą biblioteki statycznej (libmy_static_lib.a). Kiedy zrobićDlaczego cmake_link_libraries zawierają statyczne biblioteki?

target_link_libraries(my_exe my_so) 

widzę, że podczas kompilacji cmake dodał libmy_static_lib.a na linii budowlanej. Nie jest to coś, czego chcę i nie rozumiem, dlaczego jest to potrzebne. Czy jest jakiś sposób obejścia tego? LINK_PRIVATE nie robi żadnej różnicy.

Używam CMake 2.8.9.

Odpowiedz

5

Z CMake documentation for target_link_libraries:

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

[...] Biblioteka zależności są przechodnie domyślnie z tym podpisem. Kiedy ten cel zostanie połączony z innym obiektem docelowym, biblioteki powiązane z tym celem pojawią się również w linii łącza dla drugiego celu.

Rozwiązaniem jest użycie podpisu target_link_libraries, który pozwala ręcznie określić przechodni zachowanie:

# 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

prywatnej nie wydają się istnieć dla CMake 2.8, a LINK_PRIVATE nie działa dla mnie. To znaczy, otrzymuję takie samo zachowanie, jak bez LINK_PRiVATE – Rolle

+1

@Rolle Right, jest to funkcja wymagająca co najmniej CMake 2.8.11. W przypadku wcześniejszych wersji obawiam się, że będziesz musiał ręcznie zetrzeć właściwości docelowe. Sugerowałbym jednak, aby uaktualnić swoją wersję CMake, jeśli to możliwe. – ComicSansMS

+0

'LINK_PRIVATE' powinno działać poprawnie z CMake 2.8.9. – steveire

Powiązane problemy