2009-09-07 22 views
16

Mam plik CMakeLists.txt, który wygląda tak:Jak budować pliki obiektów tylko raz z cmake?

add_executable(exec1 exec1.c source1.c source2.c source3.c) 
add_executable(exec2 exec2.c source1.c source2.c source3.c) 
add_executable(exec3 exec3.c source1.c source2.c source3.c) 

source1.o source2.o source3.o pliki zająć naprawdę dużo czasu na budowę, a ponieważ są one wspólne dla wszystkich plików wykonywalnych, Chcę, aby każdy z nich został zbudowany tylko raz. Obecnym zachowaniem dla cmake jest jednak przebudowanie ich dla każdego celu exec osobno, co jest niepotrzebnym powielaniem wysiłku.

Czy istnieje sposób na powiedzenie cmake, aby budował pliki obiektów tylko raz?

Odpowiedz

15

nr Byłoby to trudne do osiągnięcia, ponieważ pliki źródłowe mogą być zestawiane z różnymi opcjami kompilatora, po zbudować kroki itd

Co można zrobić, to umieścić pliki obiektu do biblioteki statycznych i powiązać z tym, że zamiast:

add_library(mylib STATIC source1.c source2.c) 
add_executable(myexe source3.c) 
target_link_libraries(myexe mylib) 

edit: oczywiście, można umieścić go w wspólne biblioteki, jak również.

+3

Przestrzegaj tego podejścia. Biblioteki współdzielone mogą być bardziej przyjazne, jeśli istnieje wiele przykładów exe http://blog.flameeyes.eu/2008/01/21/what-to-do-with-shared-code – richq

+2

Tak, oczywiście. Myślę, że właśnie założyłem, że OP chce kodu powielonego w każdym z plików wykonywalnych. – JesperE

12

Tak, w CMake 2.8.8 można użyć biblioteki obiektów, która jest rodzajem biblioteki wirtualnej, która ma takie same właściwości organizacyjne i zależne od rzeczywistej biblioteki statycznej lub współużytkowanej, ale nie tworzy pliku na dysku. Zobacz CMake Tutorials: Object Library.