2012-02-18 3 views
27

Biorąc Mam zdefiniowane wykonywalny z głównego pliku źródłowego w CMakeList.txt pliku:Czy można dodać kolejne pliki źródłowe do pliku wykonywalnego po zdefiniowaniu?

ADD_EXECUTABLE(MyExampleApp main.cpp) 

mogę dodać kolejne pliki źródłowe do tego pliku wykonywalnego po tej linii, ale w tym samym lub dołączonym CMakeList.txt pliku?

+3

Normalnie to zrobić za pomocą zmiennych zamiast plików na ADD_EXECUTABLE() wiersz. – drescherjm

+4

@drescherjm podał poprawną odpowiedź - po prostu zbierz swoje źródła za pomocą 'list (APPEND SOURCES src.cpp src2.cpp)' lub 'set (SOURCES src.cpp)' i 'set (SOURCES $ {SOURCES} src2.cpp)'. – arrowd

+0

Dzięki. Robiłem to w ten sposób, ale wydawało mi się to jakoś brutalne. Tak czy inaczej. To działa. –

Odpowiedz

32

Zastosowanie target_sources, dostępny od cmake 3,1

np. target_sources(MyExampleApp PUBLIC ${extra_file})

https://cmake.org/cmake/help/v3.1/command/target_sources.html

+1

Jeśli celem jest biblioteka (nie jest to plik wykonywalny), ta sztuczka działa również, ale powinieneś użyć 'PRIVATE' zamiast' PUBLIC', w przeciwnym razie konkretny plik źródłowy zostanie połączony dwukrotnie. –

8

myślę, że może użyć:

add_executable(MyExampleApp main.cpp) 
add_library(library STATIC ${ADDITIONAL_SOURCES}) 
set_target_properties(library PROPERTIES 
    LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) 
target_link_libraries(MyExampleApp library) 
+1

ciekawe rozwiązanie dla tego problemu :) sprytny –

+0

Należy zauważyć, że to nie działa dla plików zasobów systemu Windows (.rc) nieoczekiwanie, nawet jeśli normalnie mogą być dostarczane jako pliki źródłowe do 'add_library()' . CMake skarży się, że zmienna "CMAKE_RC_CREATE_STATIC_LIBRARY" nie jest ustawiona. Obejście obejmuje także pusty plik źródłowy .c. –

3

Należy zauważyć, że w przypadku nowszych wersji CMake (> 3,1 myślę) można dołączać pliki do nieruchomości SOURCES na cele.

http://www.cmake.org/cmake/help/v3.3/prop_tgt/SOURCES.html

+3

Możesz też użyć ['target_sources()'] (http://www.cmake.org/cmake/help/v3.3/command/target_sources.html?highlight=target_sources) (patrz odpowiedź DarthB'a [tutaj] (http://stackoverflow.com/a/31541070/4763489)). – Florian