2017-11-26 2 views
0

이것은 단지 관찰 일 뿐이므로 어디에 문제가 있는지 이해하지 못합니다. 나는 벡터 덧셈 연산자를 구현하고 모든 것은 주 함수에서 꽤 잘 작동한다. 하지만 Google 테스트에서 테스트 할 때 컴파일 오류가 발생했습니다.gtest : 'operator +'에 대한 정의되지 않은 참조

In function `ZN15Basic_Dirs_Test8TestBodyEv': 
C:/Users/home/Documents/clion/example/test/main.cpp:10: undefined reference 
to `operator+(std::vector<int, std::allocator<int> > const&, 
std::vector<int, std::allocator<int> > const&)' 

src/class.cpp 파일을 제거하면 컴파일됩니다. 어떻게 작동하는지 말해 줄 수 있니? :)

코드는 다음과 같습니다.

SRC/class.h

#ifndef EXAMPLE_CLASS_H 
#define EXAMPLE_CLASS_H 

#include <vector> 

std::vector<int> operator+(const std::vector<int>& a, const std::vector<int>& b); 

#endif //EXAMPLE_CLASS_H 

SRC/class.cpp

#include "class.h" 

std::vector<int> operator+(const std::vector<int>& a, const std::vector<int>& b) { 
    if (a.size() != b.size()) { 
     std::cerr << "vectors are not of the same size!\n"; 
     exit(1); 
    } 
    std::vector<int> res(a.size()); 
    for (unsigned i = 0; i < a.size(); ++i) { 
     res[i] = a[i] + b[i]; 
    } 
    return res; 
} 

테스트/MAIN.CPP

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

using namespace std; 

TEST(Basic, Dirs) { 
    std::vector<int> a = {1, 1, 0}; 
    std::vector<int> b = {2, 1, 0}; 
    std::vector<int> c = a+b; 
    EXPECT_EQ(c[0], 3); 
    EXPECT_EQ(c[1], 2); 
    EXPECT_EQ(c[2], 0); 
} 

./CMakeLists

cmake_minimum_required(VERSION 3.7) 
project(example) 

set(CMAKE_CXX_STANDARD 11) 

set(SOURCE_FILES src/main.cpp src/class.cpp) 
add_subdirectory(test) 
add_executable(example ${SOURCE_FILES}) 

테스트/CMakeLists

set(CMAKE_CXX_STANDARD 11) 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall") 
add_subdirectory("../lib/googletest" "${CMAKE_CURRENT_BINARY_DIR}/gtest_build") 
include_directories(../lib/googletest/googletest/include) 
include_directories(../src/) 
add_executable(runtest main.cpp) 
target_link_libraries(runtest gtest gtest_main) 
+0

이 더 CMakc 질문처럼 보인다, class.cpp를'add_executable (runtest main.cpp ../ src/class.cpp)'와 같이'test'에 추가해야한다고 생각합니다. –

답변

0

당신은 당신의 example에 대해 당신이 runtest gtest 실행 연결하는 것을 잊었다 :

./CMakeLists

cmake_minimum_required(VERSION 3.7) 
project(example) 

set(CMAKE_CXX_STANDARD 11) 

set(SOURCE_FILES src/main.cpp src/class.cpp) 
add_executable(example ${SOURCE_FILES}) 
add_subdirectory(test) 

테스트/CMakeLists

set(CMAKE_CXX_STANDARD 11) 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall") 
add_subdirectory("../lib/googletest" "${CMAKE_CURRENT_BINARY_DIR}/gtest_build") 
include_directories(../lib/googletest/googletest/include) 
include_directories(../src/) 
add_executable(runtest main.cpp) 
target_link_libraries(runtest gtest gtest_main example) 

또한 실제로 (단지 main 기능 제거 - 당신은 아마 어쨌든 필요하지 않습니다)를 대신 실행 파일의 공유 라이브러리로 example을 정의하기 위해 더 좋을 수도하지 않는 것이 :

add_library(example SHARED ${SOURCE_FILES}) 
관련 문제