2017-09-26 1 views
0

J'ai une liste de fichiers qui doivent être compilés pour mon exécutable principal. Mes tests ont également besoin de ces fichiers. Lorsque le (s) exécutable (s) de test est (sont) construit (s), les fichiers objets sont reconstruits, même si plus tôt dans la construction, ils ont été construits lors de la construction de l'exécutable principal. Ai-je tort de penser que ce n'est pas nécessaire?CMake - objets construits deux fois inutilement?

Si oui est-il un moyen de désactiver cela?

Exemple:

set(SOURCES 
${SOURCE_DIR}/file.c 
${SOURCE_DIR}/another_file.c) 

set(MAIN ${SOURCE_DIR}/main.c) 

add_executable(main_executable ${SOURCES} ${MAIN}) 

add_executable(test1_ex ${PROJECT_SOURCE_DIR}/test/test1.cc ${SOURCES}) 
+0

Pouvez-vous publier les parties pertinentes de votre fichier makefile? –

+2

Si vous répertoriez le même fichier source pour plusieurs cibles, il sera construit une fois * pour chaque cible *. –

+0

CMake les construira deux fois, car vous pourriez avoir différents drapeaux de compilation pour vos exécutables principal et de test. Vous pouvez éviter cela en les compilant d'abord dans une bibliothèque, puis en liant cette bibliothèque à vos deux exécutables. –

Répondre

3

Placez le code commun dans une bibliothèque et liez la bibliothèque à votre application et à vos tests.

# The application's sources - except main 
set(SOURCES 
     ${SOURCE_DIR}/file.c 
     ${SOURCE_DIR}/another_file.c) 

# build an application library 
add_library(app_lib ${SOURCES}) 

# build an executable in terms of the application library 
set(MAIN ${SOURCE_DIR}/main.c) 
add_executable(main_executable ${MAIN}) 
target_link_libraries(main_executable PRIVATE app_lib) 

# build a test executable in terms of the application library 
add_executable(test1_ex ${PROJECT_SOURCE_DIR}/test/test1.cc) 
target_link_libraries(test1_ex PRIVATE app_lib) 
0

Cela pourrait être dû au scénario suivant:

add_library(mylib1 file1.cpp common.cpp) 
add_library(mylib2 file2.cpp common.cpp) 

qui a créé le même problème que vous rencontrez pour moi, où common.cpp en reconstruction pour chaque bibliothèque. Ma solution était la suivante:

add_library(common_lib common.cpp) 
add_library(mylib1 file1.cpp) 
add_library(mylib2 file2.cpp) 
target_link_libraries(mylib1 common_lib) 
target_link_libraries(mylib2 common_lib) 

qui a résolu le problème pour moi que le bâtiment (création d'objet) a été fait une fois, mais il était lié à tous les autres bibliothèques.