Dependencies issue on googletest with cmake: gtest/gtest.h No such file or directory

17,013

You should give valid directory and lib in your make file.

In your CMakeLists.txt file do the following:

  1. Add googletest subdirectory
add_subdirectory(${CMAKE_BINARY_DIR}/googletest)
  1. Link against gtest library
target_link_libraries(${PROJECT_TEST_NAME}
    foo
    gtest
    gtest_main
)
Share:
17,013

Related videos on Youtube

Garag
Author by

Garag

Updated on June 04, 2022

Comments

  • Garag
    Garag almost 2 years

    Bonjour,

    I am currently working a bit on CMake in order to use ExternalProject_add at work. And as I want to test googletest, I try to test both. I encounter an issue during the compilation of my unit test code.

    So I just follow the README of the googletest project on github: https://github.com/google/googletest/blob/master/googletest/README.md#incorporating-into-an-existing-cmake-project.

    Here is my project tree:

    test_cpp/
    ├── build
    ├── CMakeLists.txt
    ├── CMakeLists.txt.in
    ├── inc
    │   └── foo.h
    ├── src
    │   └── foo.c
    └── test
        └── test_foo.c
    

    My test_foo.c just test a function in foo that round a double:

    #include "gtest/gtest.h"
    #include "foo.h"
    
    TEST(AddTest, roundValue)
    {
            ASSERT_EQ(roundValue(2.6),3);
    }
    
    int main(int argc, char **argv)
    {
            ::testing::InitGoogleTest(&argc,argv);
            return RUN_ALL_TESTS();
    }
    

    Here it the result of the cmake command:

    axis@axis-mad:~/Work/test_cpp/build$ cmake ..
    -- The C compiler identification is GNU 5.4.0
    -- The CXX compiler identification is GNU 5.4.0
    -- Check for working C compiler: /usr/bin/cc
    -- Check for working C compiler: /usr/bin/cc -- works
    -- Detecting C compiler ABI info
    -- Detecting C compiler ABI info - done
    -- Check for working CXX compiler: /usr/bin/c++
    -- Check for working CXX compiler: /usr/bin/c++ -- works
    -- Detecting CXX compiler ABI info
    -- Detecting CXX compiler ABI info - done
    -- Found Git: /usr/bin/git (found version "2.7.4")
    -- Configuring done
    -- Generating done
    -- Build files have been written to:     /home/axis/Work/test_cpp/build/googletest-download
    Scanning dependencies of target googletest
    [ 11%] Creating directories for 'googletest'
    [ 22%] Performing download step (git clone) for 'googletest'
    Clonage dans 'googletest-src'...
    Déjà sur 'master'
    Votre branche est à jour avec 'origin/master'.
    [ 33%] No patch step for 'googletest'
    [ 44%] Performing update step for 'googletest'
    Déjà sur 'master'
    Votre branche est à jour avec 'origin/master'.
    [ 55%] No configure step for 'googletest'
    [ 66%] No build step for 'googletest'
    [ 77%] No install step for 'googletest'
    [ 88%] No test step for 'googletest'
    [100%] Completed 'googletest'
    [100%] Built target googletest
    MESSAGE CMAKE_BINARY_DIR: /home/axis/Work/test_cpp/build
    -- Found PythonInterp: /usr/bin/python (found version "2.7.12")
    -- Looking for include file pthread.h
    -- Looking for include file pthread.h - found
    -- Looking for pthread_create
    -- Looking for pthread_create - not found
    -- Looking for pthread_create in pthreads
    -- Looking for pthread_create in pthreads - not found
    -- Looking for pthread_create in pthread
    -- Looking for pthread_create in pthread - found
    -- Found Threads: TRUE  
    -- Test case source files/home/axis/Work/test_cpp/test/test_foo.c
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /home/axis/Work/test_cpp/build
    

    CMake downloads correctly googletest. The makefile and the dependencies seem also correct but I have this error at the include of gtest/gtest.h:

    axis@axis-mad:~/Work/test_cpp/build$ make
    Scanning dependencies of target foo
    [ 25%] Building C object CMakeFiles/foo.dir/src/foo.c.o
    Linking C shared library libfoo.so
    [ 25%] Built target foo
    Scanning dependencies of target gtest
    [ 50%] Building CXX object googletest-build/googlemock/gtest/CMakeFiles/gtest.dir/src/gtest-all.cc.o
    Linking CXX static library libgtest.a
    [ 50%] Built target gtest
    Scanning dependencies of target gtest_main
    [ 75%] Building CXX object googletest-build/googlemock/gtest/CMakeFiles/gtest_main.dir/src/gtest_main.cc.o
    Linking CXX static library libgtest_main.a
    [ 75%] Built target gtest_main
    Scanning dependencies of target foo_test
    [100%] Building C object CMakeFiles/foo_test.dir/test/test_foo.c.o
    In file included from /home/axis/Work/test_cpp/test/test_foo.c:1:0:
    /home/axis/Work/test_cpp/build/googletest-src/googletest/include/gtest/gtest.h:54:18: fatal error: limits: No such file or directory
    compilation terminated.
    CMakeFiles/foo_test.dir/build.make:54 : recipe for target « CMakeFiles/foo_test.dir/test/test_foo.c.o » failed
    make[2]: *** [CMakeFiles/foo_test.dir/test/test_foo.c.o] Error 1
    CMakeFiles/Makefile2:97 : recipe for target « CMakeFiles/foo_test.dir/all » failed
    make[1]: *** [CMakeFiles/foo_test.dir/all] Erreur 2
    Makefile:123 : recipe for target « all » failed
    make: *** [all] Error 2
    

    Here is my CMakeLists.txt file:

    cmake_minimum_required(VERSION 2.8.9)
    project (foo)
    
    ## Dependencies
    include(ExternalProject)
    
    # Use CMake to download GoogleTest as part of the build's configure step
    # Download and unpack googletest at configure time
    configure_file(CMakeLists.txt.in googletest-download/CMakeLists.txt)
    execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" .
      RESULT_VARIABLE result
      WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/googletest-download )
    if(result)
      message(FATAL_ERROR "CMake step for googletest failed: ${result}")
    endif()
    execute_process(COMMAND ${CMAKE_COMMAND} --build .
      RESULT_VARIABLE result
      WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/googletest-download )
    if(result)
      message(FATAL_ERROR "Build step for googletest failed: ${result}")
    endif()
    
    # Add googletest directly to our build. This defines
    # the gtest and gtest_main targets.
    add_subdirectory(${CMAKE_BINARY_DIR}/googletest-src
                     ${CMAKE_BINARY_DIR}/googletest-build
                     EXCLUDE_FROM_ALL)
    
    # The gtest/gtest_main targets carry header search path
    # dependencies automatically when using CMake 2.8.11 or
    # later. Otherwise we have to add them here ourselves.
    if (CMAKE_VERSION VERSION_LESS 2.8.11)
      include_directories("${gtest_SOURCE_DIR}/include")
    endif()
    
    ## Main Project
    include_directories(inc)
    
    file(GLOB SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.c)
    add_library(foo SHARED ${SOURCES})
    
    ## Test
    
    enable_testing()
    set(PROJECT_TEST_NAME ${PROJECT_NAME}_test)
    
    file(GLOB TEST_SRC_FILES ${CMAKE_CURRENT_SOURCE_DIR}/test/*.c)
    message(STATUS "Test case source files" ${TEST_SRC_FILES})
    
    add_executable(${PROJECT_TEST_NAME} ${TEST_SRC_FILES})
    target_link_libraries(${PROJECT_TEST_NAME}
        foo
        gtest_main
    )
    add_test(NAME ${PROJECT_TEST_NAME} COMMAND ${PROJECT_TEST_NAME})
    

    I tried to use include_directories with the full path of my googletest include dir but with no much result. So I am a bit out of idea

    regards

    • Tsyvarev
      Tsyvarev over 6 years
      Contrary to the title, non-english message fatal error: limits: Aucun fichier ou dossier de ce type looks like fatal error: limits: No such file or directory. Please, fix the title. As for error message itself, it is because gtest/gtest.h is a C++ header (and googletest, in total, is C++ test platform), but you use it with test written in C language.
  • Garag
    Garag over 6 years
    Hi Preetam, the *.c files was the reason of the error. I tested with and without gtest in the target_link_librairies and it worked both. But I will keep in mind to add both gtest and gtest_main.
  • Preetam Singh
    Preetam Singh over 6 years
    Hi Garag,could you please provide .c and .h file that i can take a look. if You want send Demo code [email protected]
  • Fabian
    Fabian over 2 years
    Hi Preetam, can you explain, which of the CMakeLists.txt do you mean? Regarding to this example (what lead me to the same issue as above), there are a lot of CMakeLists.txt. cheuksblog.ca/tutorial/2017/12/19/googletest-tutorial.html Writing in the root CMakeLists leads to another error.