Dependencies issue on googletest with cmake: gtest/gtest.h No such file or directory
You should give valid directory and lib in your make file.
In your CMakeLists.txt
file do the following:
- Add
googletest
subdirectory
add_subdirectory(${CMAKE_BINARY_DIR}/googletest)
- Link against
gtest
library
target_link_libraries(${PROJECT_TEST_NAME}
foo
gtest
gtest_main
)
Related videos on Youtube
Garag
Updated on June 04, 2022Comments
-
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 over 6 yearsContrary to the title, non-english message
fatal error: limits: Aucun fichier ou dossier de ce type
looks likefatal error: limits: No such file or directory
. Please, fix the title. As for error message itself, it is becausegtest/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 over 6 yearsHi 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 over 6 yearsHi Garag,could you please provide .c and .h file that i can take a look. if You want send Demo code [email protected]
-
Fabian over 2 yearsHi 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.