为什么在构建包含cmake的gtest的项目时找不到main?

时间:2018-11-30 21:30:56

标签: build cmake

我有一个非常小的项目,我使用GTest创建了一些单元测试。 要构建它,我正在使用CMake。它可以很好地编译,但是却给了我下面显示的错误。我包括所有make输出,以防万一。

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是我包含的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 :(得分:1)

目标GTest::Gtest定义的库不包含main函数定义。为了获得main的定义,您需要与GTest::Main链接。这是用documentation编写的。

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