2016-10-25 2 views
1

GTest를 사용하려고하고 예제가 작동합니다. 이제 내 자신의 코드를 테스트하고 싶지만 연결 문제가 발생합니다.GTest 연결 오류 : 'foo :: function'에 대한 정의되지 않은 참조

stackoverflow에서 검색 한 결과 비슷한 문제가 발견되었지만 답변을 통해 문제를 해결할 수 없었습니다.

내 파일은 다음과 같습니다

CMakeLists.txt

cmake_minimum_required(VERSION 2.6) 

SET(CMAKE_CXX_FLAGS "-std=gnu++11") 

# Locate GTest 
find_package(GTest REQUIRED) 
include_directories(${GTEST_INCLUDE_DIRS}) 
file(GLOB files 
    Datahandler.h 
    Datahandler.cpp 
    ) 

# Link runTests with what we want to test and the GTest and pthread library 
add_executable(runTests tests.cpp ${files}) 
target_link_libraries(runTests ${GTEST_LIBRARIES} pthread) 

tests.cpp

#include "DataHandler.h" 
#include <gtest/gtest.h> 

TEST(checkFilled, All){ 
    DataHandler handler("loc", "prot", 1); 
    handler.filledElement[1] = 1; 
    ASSERT_EQ(1, handler.checkFilled(1)); 
    ASSERT_EQ(0, handler.checkFilled(2)); 
    ASSERT_EQ(1, handler.checkFilled(8)); 
    ASSERT_EQ(0, handler.checkFilled(9)); 
} 

int main(int argc, char **argv) { 
    testing::InitGoogleTest(&argc, argv); 
    return RUN_ALL_TESTS(); 
} 

내가 얻는 오류가 있습니다 :

CMakeFiles/runTests.dir/tests.cpp.o: In function `checkFilled_All_Test::TestBody()': 
tests.cpp:(.text+0x121): undefined reference to `DataHandler::DataHandler(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned char)' 
tests.cpp:(.text+0x172): undefined reference to `DataHandler::checkFilled(unsigned char)' 
tests.cpp:(.text+0x271): undefined reference to `DataHandler::checkFilled(unsigned char)' 
tests.cpp:(.text+0x382): undefined reference to `DataHandler::checkFilled(unsigned char)' 
tests.cpp:(.text+0x48d): undefined reference to `DataHandler::checkFilled(unsigned char)' 
collect2: error: ld returned 1 exit status 
CMakeFiles/runTests.dir/build.make:95: recipe for target 'runTests' failed 
make[2]: *** [runTests] Error 1 
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/runTests.dir/all' failed 
make[1]: *** [CMakeFiles/runTests.dir/all] Error 2 
Makefile:83: recipe for target 'all' failed 
make: *** [all] Error 2 
,536,

필자는 include 또는 link 문제와 관련이 있다고 확신하지만 올바른 구문을 찾을 수 없습니다.

SET(CMAKE_CXX_FLAGS "-std=gnu++11") 

CMAKE_CXX_FLAGS를 사용하여, 이전 값을 지우지하는 것이 좋습니다 :

답변

0

이 CMake 프로젝트에서 몇 가지 포인트가 있습니다 기본적으로

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11") 

, 값이 비어 그래서 여기서 아무것도 바꿔서는 안됩니다. 어쨌든, C++ (11)을 요구하는 대신 CMAKE_CXX_STANDARD 고려할 수 :

SET(CMAKE_CXX_STANDARD 11) 
SET(CMAKE_CXX_STANDARD_REQUIRED ON) 

다음을 :

file(GLOB files 
    Datahandler.h 
    Datahandler.cpp 
    ) 

당신이 GLOB를 사용하는 경우

, 당신이 경로를 파일, 파일 패턴을하지 통과해야한다. 어쨌든, doc에서 :

We do not recommend using GLOB to collect a list of source files from your source tree. If no CMakeLists.txt file changes when a source is added or removed then the generated build system cannot know when to ask CMake to regenerate.

대신 set 고려 :

set(files 
    Datahandler.h 
    Datahandler.cpp 
    ) 

다음을 :

include_directories(${GTEST_INCLUDE_DIRS}) 

#... 

target_link_libraries(runTests ${GTEST_LIBRARIES} pthread) 

대신 구식 ${GTEST_LIBRARIES}, 당신이 고려할 수 imported targets :

target_link_libraries(runTests GTest::Main) 

GTest::Main은 가져온 대상을 통해 포함 디렉토리를 처리하므로 include_directories을 호출 할 필요가 없습니다. 또한 스레드 라이브러리에 종속성을 추가하므로 pthread (테스트 할 수 있음)을 제거 할 수 있다고 확신합니다. 마지막으로 GTest::Main에는 수행 한 작업을 수행하는 기본 기능의 기본 구현이 포함되어 있으므로이를 제거 할 수 있습니다.

cmake_minimum_required(VERSION 2.8.11) 

SET(CMAKE_CXX_STANDARD 11) 
SET(CMAKE_CXX_STANDARD_REQUIRED ON) 

set(files 
    Datahandler.h 
    Datahandler.cpp 
    ) 

# Locate GTest 
find_package(GTest REQUIRED) 

# Link runTests with what we want to test and the GTest library 
add_executable(runTests tests.cpp ${files}) 

target_link_libraries(runTests GTest::Main) 
: 그래서 2016에서 CMake 프로젝트가 같아야합니다

cmake_minimum_required(VERSION 2.8.11) 

: 당신이 CMake의 최소 요구 버전을 업그레이드해야합니다

주 목표 완전히 availables를 수입하려면

test.cpp :

#include "DataHandler.h" 
#include <gtest/gtest.h> 

TEST(checkFilled, All){ 
    DataHandler handler("loc", "prot", 1); 
    handler.filledElement[1] = 1; 
    ASSERT_EQ(1, handler.checkFilled(1)); 
    ASSERT_EQ(0, handler.checkFilled(2)); 
    ASSERT_EQ(1, handler.checkFilled(8)); 
    ASSERT_EQ(0, handler.checkFilled(9)); 
} 
관련 문제