2017-07-26 2 views
1

Supposons que vous vouliez effectuer des tests unitaires sur des classes dans un exécutable mais que vous ne souhaitiez pas les refactoriser dans une bibliothèque où vous pouvez ajouter la bibliothèque en utilisant target_link_libraries(target library) dans cmake.Comment lier un projet exe aux classes d'un autre projet exe

Comment donner l'accès à la classe de test aux autres classes?

1) Construire un projet de test avec les fichiers sources de l'autre projet? autre chose

include_directories(${otherExeProjectDir}) 

    set(SOURCE_FILES 
    main.cpp 
    tests.h 
    tests.cpp 
    ${otherExeProjectDir}/otherclass1.h 
    ${otherExeProjectDir}/otherclass2.h 
    ) 

2) du projet de test de liaison avec les fichiers OBJ de l'autre projet? une sorte de add_library(otherclass.obj) folie?

3)

+0

Je ne comprends pas votre question. Dire que vous avez une classe dans votre projet et maintenant vous voulez faire un test d'unité pour cette classe. Ce que vous devez faire est simplement d'inclure le fichier head de cette classe et de coder votre test unitaire et une fonction principale pour votre test unitaire. – Yves

+0

deux projets: autre projet et projet d'essai. l'autre projet a un principal comme fait le projet de test. Le projet de test n'aura aucune idée de l'endroit où rechercher l'en-tête si je l'inclue simplement. – codeMetis

+0

Je ne comprends pas. Pourquoi ne pouvez-vous pas simplement l'inclure. Tu ne peux pas le voir où c'est? – Yves

Répondre

2

Si vos principaux emplacements source exécutable sont simples ou à plat, alors quelque chose comme ça pourrait fonctionner:

cmake_minimum_required(VERSION 3.9) 
project(tests) 

# Get main executable source location properties 
get_target_property(exe_sources exe SOURCES) 
get_target_property(exe_source_dir exe SOURCE_DIR) 

# Remove main entry point file 
list(REMOVE_ITEM exe_sources main.cpp) 

# Add test sources 
add_executable(test1 test1.cpp) 

# Add exe sources to test (assumes sources are relative paths) 
foreach(src IN LISTS exe_sources) 
    target_sources(test1 PRIVATE "${exe_source_dir}/${src}") 
endforeach() 

# Add exe include directories to test 
target_include_directories(test1 PRIVATE 
    ${exe_source_dir} 
    $<TARGET_PROPERTY:exe,INCLUDE_DIRECTORIES>) 

Sinon, la solution générale est, malheureusement, à compter sur des informations externes, par exemple les emplacements de fichiers source de premier niveau ou en ajoutant vos propres propriétés source à la cible exécutable principale.