Почему main не найден при создании проекта, включающего gtest с cmake? - PullRequest
0 голосов
/ 01 декабря 2018

У меня очень маленький проект, для которого я создал несколько юнит-тестов с помощью GTest.Для сборки я использую CMake.Он прекрасно компилируется, но выдает ошибку, показанную ниже.Я включаю все make output на всякий случай.

Scanning dependencies of target trace
[ 33%] Building C object CMakeFiles/trace.dir/trace/system_trace.c.o
[ 33%] Built target trace
Scanning dependencies of target data-test
[ 66%] Building CXX object CMakeFiles/data-    test.dir/data_testsuite.cpp.o
[100%] Linking CXX executable data-test
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status
CMakeFiles/data-test.dir/build.make:86: recipe for target 'data-test'     failed
make[2]: *** [data-test] Error 1
CMakeFiles/Makefile2:72: recipe for target 'CMakeFiles/data-test.dir/all' failed
make[1]: *** [CMakeFiles/data-test.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

И я понятия не имею, почему не находит main.Main - это часть GTest, которую я включил, как видно из CMakeLists.txt :

cmake_minimum_required(VERSION 2.8)

set (CMAKE_CXX_STANDARD 11)

project(data-test C CXX)

set(CMAKE_C_FLAGS_DEBUG   "-g3 -Og -Wall")
set(CMAKE_CXX_FLAGS_DEBUG "-g3 -Og -Wall")

set(CMAKE_C_FLAGS_RELEASE   "-g0 -O3 -Wall")
set(CMAKE_CXX_FLAGS_RELEASE "-g0 -O3 -Wall")

include(GoogleTest)

set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
set(THREADS_PREFER_PTHREAD_FLAG TRUE)
find_package(Threads REQUIRED)

find_package(GTest REQUIRED)

include_directories(cfg)
include_directories(system)
include_directories(system/include)

include(trace/CMakeLists.txt)

add_executable(data-test
    $<TARGET_OBJECTS:trace>
    data_testsuite.cpp
)

target_link_libraries(data-test Threads::Threads GTest::GTest)

gtest_discover_tests(data-test)

И, как вы можете видеть из make вывод команды, он просто компилируется.

Знаете ли вы, что происходит?

1 Ответ

0 голосов
/ 01 декабря 2018

Библиотеки, определенные целью GTest::Gtest, не содержат main определения функции.Для получения определения main вам нужна ссылка с GTest::Main.Это написано в документации .

target_link_libraries(data-test Threads::Threads GTest::Main)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...