2016-07-02 10 views
0

Ich möchte Google C++ testen und ich bin komplett Anfänger zu cmake und gtest.Cmake und Gtest

Ich habe eine Klasse namens Filter, die eine 3D-Party-Bibliothek namens Jane verwendet.

Für diesen Fall habe ich ein cmakeFile die schön mein Projekt baut sich wie folgt:

cmake_minimum_required(VERSION 3.1.2) 
project(Filter) 
include(../../../cmake/CMakeMacros.txt) 
set_variables() 
#add 3rdparty libraries 
add_jane() 
#add framework libraries 
add_framework_libs(
ip/Image 
) 
include_directories(
../include 
${FW_INCLUDE_DIRS} 
) 

#set project's source and include files 
set(INCS 
../include/${PROJECT_NAME}.h 
../include/${PROJECT_NAME}.tpp 
../include/FilterMask.h 
) 

set(SRCS 
../src/${PROJECT_NAME}.cpp 
../src/FilterMask.cpp 
) 

#set link directories 
link_directories(
${FW_LIBRARY_DIRS} 
) 

#build project as static library (*.lib) 
add_library(${PROJECT_NAME} STATIC 
${INCS} 
${SRCS} 
) 
#link libraries against project 
target_link_libraries(${PROJECT_NAME} 
${FW_LIBRARIES} 
) 

#if a test executable should be build 
if(Test_BUILD_EXAMPLES) 
#build test executable 
add_executable(${PROJECT_NAME}Test 
    ../src/main.cpp 
) 
#link library against executable 
target_link_libraries(${PROJECT_NAME}Test 
    ${PROJECT_NAME} 
) 
endif(Test_BUILD_EXAMPLES) 

und auch habe ich diese einfache Anleitung auf https://github.com/snikulov/google-test-examples mit dieser Cmake Datei https://github.com/snikulov/google-test-examples/blob/master/CMakeLists.txt und versuchte noch einmal lesen mein Projekt zu bauen, zu kombinieren Diese Cmake-Dateien zusammen (kann sehr albern sein), aber ich kann es seit Tagen nicht erreichen.

Das Problem ist, dass, wenn ich ein einfaches Projekt mit nur einer Header-Datei testen möchte ich diese cmake-Datei verwenden kann, aber sobald ich versuche, mein Projekt mit einer 3rd-Party-Bibliothek zu testen, stoße ich auf verschiedene Fehler.

Kann mir bitte jemand sagen, wie ich eine korrekte cmake-Datei bearbeiten kann, um mein Projekt mit googleTest zu testen, indem ich eine cmake-Datei verwende!?

+0

Möglicherweise möchten Sie prüfen, [diese Antwort] (http: //stackoverflow.com/a/31622855/1938798) für eine alternative Methode, um gtest zu Ihrem Build anstatt der Methode in diesem Tutorial zu bringen. Der Artikel, auf den die Antwort verweist, hat auch ein Projekt auf github mit einem voll funktionsfähigen Beispiel. Was Ihr Verknüpfungsproblem betrifft, so würden Sie, wenn Sie die tatsächlichen Fehler anzeigen, die Sie erhalten, eine spezifischere Diagnose Ihres zugrunde liegenden Problems ermöglichen. Es ist auch ziemlich seltsam, dass Ihr Projekt alle Quellen usw. aus Verzeichnissen außerhalb des Projekts bezieht. –

Antwort

1

Wenn Sie gegen eine 3rd-Party-Bibliothek verknüpfen mögen Sie in der Regel zuerst:

  1. find_package() oder die PKG-Konfigurationsunterstützung verwendet die Bibliothek zu überprüfen, auf der Build-Host verfügbar ist und einen Verweis auf mich abholen.
  2. Fügen Sie den Verweis aus Schritt 1 in target_link_libraries()

Also das ist, was Sie für Ihre 3rd-Party-lib tun müssen. Für Ihren eigenen Code, den Sie testen möchten, möchten Sie wahrscheinlich alles in Ihre eigenen Bibliotheken schreiben und dann Ihre Tests mit diesen verknüpfen.

Wenn Sie mehrere Test-Executables haben, um jede Test-Suite in ihre eigenen Binärdateien zu isolieren, benötigen Sie wahrscheinlich eine alternative Technik, um Überbindungen zu vermeiden und den Code innerhalb der Testsuite auf die tatsächlich getestete Einheit zu beschränken. (Dies ist auch sehr nützlich, wenn Ihre Codebasis sich im Fluss befindet und nur teilweise erstellt wird, Sie aber dennoch überprüfen möchten, dass Builds weiterhin relevante Tests bestehen.)

In diesem Fall möchten Sie möglicherweise Ihre zu testenden Einheiten als definieren OBJECT Typ Bibliotheken und dann statt target_link_libraries() gegen diese Objekt-Bibliotheken machen Sie die Objekte als Teil der Quellen für die ausführbare Datei mit dieser Syntax: $<TARGET_OBJECTS:NameOfObjLibHere> (cmake Generator Ausdrücke).

So im Fall von Einheiten, die auf einem 3rd-Party-lib abhängen, sagen, QT5 Kern, würden Sie Schnipsel wie dieses:

# define the dependency on 3rd party project Qt5, (sub)component: Core, Test) 
set(MY_QT_VERSION "5.4.0") 
find_package(Qt5 ${MY_QT_VERSION} REQUIRED COMPONENTS Core CONFIG) 

# define the object lib for a unit to be tested (Item1) 
set(item1_srcs item1.cpp util1.cpp) 
add_library(Item1 TYPE OBJECT ${item1_srcs}) 

# ensure that necessary compiler flags are passed 
# when building "Item1" separately 
# note that PRIVATE may also be INTERFACE or PUBLIC 
# read the cmake docs on target_include_*** to determine which applies. 
# you probably want to hide this behind a convenience macro. 
target_include_directories(Item1 PRIVATE $<TARGET_PROPERTY:Qt5::Core,INTERFACE_INCLUDE_DIRECTORIES>) 
target_compile_options(Item1 PRIVATE $<TARGET_PROPERTY:Qt5::Core,INTERFACE_COMPILE_OPTIONS>) 

# find the unit testing framework (dependency) 
# this sample uses Qt5 Test (Qt5::Test) but you could use GTest, too 
find_package(Qt5 ${MY_QT_VERSION} REQUIRED COMPONENTS Test CONFIG) 

# define an executable which contains test sources + unit under test 
# link against the testing framework (obviously) as per normal 
# note the Qt5::Core dependency here: remember Item1 depends on Qt5::Core (!) 
set(test_item1_srcs, test_item1.cpp $<TARGET_OBJECTS:Item1>) 
add_executable(test_item1 ${test_item1_srcs) 
target_link_libraries(test_item1 Qt5::Core Qt5::Test) 

# inform cmake/ctest integration about our test 
# so it knows to execute it during `make test` phase. 
# and other cmake/ctest integration falls into place as well, possibly 
add_test(test_item1 test_item1)