Recientemente me han vendido el uso de CMake para compilar mis proyectos de C ++, y ahora me gustaría comenzar a escribir algunas pruebas unitarias para mi código. Decidí usar la utilidad Google Test para ayudar con esto, pero necesito ayuda para comenzar.
Todo el día he estado leyendo varias guías y ejemplos que incluyen el Manual , una introducción en IBM y algunas preguntas sobre SO ( aquí y aquí ), así como otras fuentes de las que he perdido la noción. Me doy cuenta de que hay mucho por ahí, pero de alguna manera todavía tengo dificultades.
Actualmente estoy tratando de implementar la prueba más básica, para confirmar que he compilado / instalado gtest correctamente y no funciona. El único archivo fuente (testgtest.cpp) se toma casi exactamente de esta respuesta anterior:
#include <iostream>
#include "gtest/gtest.h"
TEST(sample_test_case, sample_test)
{
EXPECT_EQ(1, 1);
}
y mi CMakeLists.txt asociado es el siguiente:
cmake_minimum_required(VERSION 2.6)
project(basic_test)
# Setup testing
enable_testing()
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIR})
# Add test cpp file
add_executable(runUnitTests
testgtest.cpp
)
# Link test executable against gtest & gtest_main
target_link_libraries(runUnitTests ${GTEST_LIBRARY_DEBUG} ${GTEST_MAIN_LIBRARY_DEBUG})
add_test(
NAME runUnitTests
COMMAND runUnitTests
)
Tenga en cuenta que he elegido vincular contra gtest_main en lugar de proporcionar el principal al final del archivo cpp, ya que creo que esto me permitirá escalar las pruebas más fácilmente a varios archivos.
Cuando construyo el archivo .sln generado (en Visual C ++ 2010 Express) desafortunadamente obtengo una larga lista de errores del formulario
2>msvcprtd.lib(MSVCP100D.dll) : error LNK2005: "public: virtual __thiscall std::basic_iostream<char,struct std::char_traits<char> >::~basic_iostream<char,struct std::char_traits<char> >(void)" (??1?$basic_iostream@DU?$char_traits@D@std@@@std@@UAE@XZ) already defined in gtestd.lib(gtest-all.obj)
lo que creo que significa que no estoy enlazando con éxito a las bibliotecas gtest. Me he asegurado de que al vincular contra las bibliotecas de depuración, he intentado compilar en modo de depuración.
EDITAR
Después de investigar un poco más, creo que mi problema tiene algo que ver con el tipo de biblioteca en la que estoy construyendo gtest. Cuando construyo gtest con CMake, si no BUILD_SHARED_LIBS
está marcado, y vinculo mi programa con estos archivos .lib, recibo los errores mencionados anteriormente. Sin embargo, si BUILD_SHARED_LIBS
está marcado, entonces produzco un conjunto de archivos .lib y .dll. Cuando ahora se vincula con estos archivos .lib, el programa compila, pero cuando se ejecuta se queja de que no puede encontrar gtest.dll.
¿Cuáles son las diferencias entre una SHARED
y una SHARED
biblioteca no , y si elijo no compartido, ¿por qué no funciona? ¿Hay una opción en CMakeLists.txt para mi proyecto que me falta?
enable_testing()
hacer?
ExternalProject_Add
lugar de hacerloadd_subdirectory
. Vea esta respuesta para más detalles.