ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c-GoogleTest CMake和Make测试未运行

2019-10-28 11:51:23  阅读:276  来源: 互联网

标签:cmake makefile googletest linux c-4


我承认我有一个独特的情况.我们使用Make构建应用程序.但是我的IDE CLion使用CMake.因此,我尝试将GoogleTest设置为同时在两者上运行.我可以用两种方式编译代码(在命令行中使用make并从IDE中进行编译).但是在CLion内部,当我选择测试夹具并单击运行按钮时,未找到测试,这就是我收到的结果:

Running main() from gtest_main.cc  
[==========] Running 0 tests from 0 test cases.  
[==========] 0 tests from 0 test cases ran. (0 ms total)  
[ PASSED  ] 0 tests.

Process finished with exit code 0

这是我的测试装置:

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

namespace {
// The fixture for testing class OPPropertiesTestTest.
    class OPPropertiesTestTest : public ::testing::Test {
    protected:
        // You can remove any or all of the following functions if its body
        // is empty.

        OPPropertiesTestTest() {
            // You can do set-up work for each test here.
        }

        virtual ~OPPropertiesTestTest() {
            // You can do clean-up work that doesn't throw exceptions here.
        }

        // If the constructor and destructor are not enough for setting up
        // and cleaning up each test, you can define the following methods:

        virtual void SetUp() {
            // Code here will be called immediately after the constructor (right
            // before each test).
        }

        virtual void TearDown() {
            // Code here will be called immediately after each test (right
            // before the destructor).
        }

        // Objects declared here can be used by all tests in the test case for OPPropertiesTestTest.
    };

    TEST_F(OPPropertiesTestTest, ThisTestWillPass) {
        EXPECT_EQ(0, 0);
    }

    TEST_F(OPPropertiesTestTest, ThisTestWillFail) {
        EXPECT_EQ(0, 5);
    }


}  // namespace


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

这是我的CMakeLists.txt文件:

cmake_minimum_required(VERSION 2.8)
project(oneprint)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread -lgtest")
add_definitions(-DBOOST_LOG_DYN_LINK)


set(SOURCE_FILES
    src/controllers/OPProperties.cpp
    src/controllers/OPProperties.h
    src/main.cpp)

include_directories(src/controllers)

set(BOOST_ROOT "/usr/local/lib")
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
unset(Boost_INCLUDE_DIR CACHE)
unset(Boost_LIBRARY_DIRS CACHE)
#set(Boost_LIBRARY_DIR /usr/local/arm/lib)
set(OpenCV_LIBRARY_DIR /usr/include/opencv2)
set(Innovatrics_LIBRARY_DIR /usr/local/arm/lib)

find_package(OpenCV REQUIRED)

find_package(Boost 1.57.0 COMPONENTS filesystem thread log chrono system atomic program_options REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})

enable_testing()
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIRS})

add_executable(OnePrint ${SOURCE_FILES})

target_link_libraries(OnePrint ${OpenCV_LIBS})
target_link_libraries(OnePrint ${Boost_LIBRARIES})
target_link_libraries(OnePrint ${Innovatrics_LIBRARY_DIR})
target_link_libraries(OnePrint ${GTEST_BOTH_LIBRARIES})
target_link_libraries(OnePrint pthread)

我在src下添加了一个名为tests的文件夹,这是我的测试装置OPPropertiesTestTest所在的位置.我还在顶级添加了一个测试文件夹.此文件夹中包含一个Makefile和一个Srcs.mak文件.

这是Makefile:

TARGET = oneprint
BASE = ../

-include $(BASE)Defs.x86.mak
-include $(BASE)OpenCV.mak
-include $(BASE)Boost.mak
-include $(BASE)Innovatrics.mak
-include $(BASE)GTest.mak

-include $(BASE)Incl.mak
-include Srcs.mak

-include $(BASE)Common.mak
-include $(BASE)App.mak

这是Srcs.mak文件:

VPATH = \
../src/controllers:\
../src:\
../src/tests

CPP_SRCS = \
OPProperties.cpp \

# test files
CPP_SRCS += \
OPPropertiesTest.cpp

解决方法:

我通常不会期望将makefile混入CMake管理的项目中.听起来您的设置很复杂?

除此之外,我认为这里的根本原因可能是双重的.我认为/ src / tests /中的测试可执行文件实际上并未构建.我在您的CMakelists.txt中看不到任何会导致此问题生成的内容,因此,除非您执行其他操作,否则您不会显示给我们,因此不会编译测试文件.

也许看起来像是,您正在将gtest提供的帮助程序库链接到您的OnePrint目标中.这个辅助程序库很不寻常,因为它实现了main()函数来节省用户必须指定自己的函数.

您正在这样做

target_link_libraries(OnePrint ${GTEST_BOTH_LIBRARIES})

the docs开始,GTEST_BOTH_LIBRARIES是一个包含libgtest和libgtest-main的变量.您只需要libgtest,因为您已经编写了自己的main().因此,您应该改用GTEST_LIBRARIES.

注意:CMake代码还有其他一些问题:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread -lgtest")

这不是跨平台的(对您来说可能并不重要),例如MSVC无法识别任何这些标志.如果有关系,则需要将其包装在if(UNIX)或if(NOT MSVC)块中.

另外,这会全局设置编译器标志,即为项目中定义的每个目标设置编译器标志.如果您需要更细粒度的控制,请查看target_compile_options,您可以通过它指定每个目标.

另一个问题是-lgtest部分.这实际上是对链接器的调用,以链接gtest库.但是,CMake会为您解决这一问题-您在调用target_link_libraries(OnePrint ${GTEST_LIBRARIES})时就在这样做.

add_definitions(-DBOOST_LOG_DYN_LINK)

这样做很好,但关于在全球范围内应用的相同注释也适用.每个目标的等效值为target_compile_definitions.

set(BOOST_ROOT "/usr/local/lib")

这可能是Boost在您机器上的位置,但其他开发人员可能并非如此.该变量确实是由各个用户在调用CMake时指定的(如果需要,…许多路径会被CMake自动搜索)-您实际上不应将这样的路径硬编码到CMake文件中.

target_link_libraries(OnePrint pthread)

同样,如果您使用的是MSVC,则pthread不适合链接.这可能应该包装在if块中.

最后一点是,您可以在target_link_libraries命令中指定多个依赖关系,因此可以将其更改为:

if(NOT MSVC)
  set(PThreadLib pthread)
endif()
target_link_libraries(OnePrint
    ${OpenCV_LIBS}
    ${Boost_LIBRARIES}
    ${Innovatrics_LIBRARY_DIR}
    ${GTEST_LIBRARIES}
    ${PThreadLib})

标签:cmake,makefile,googletest,linux,c-4
来源: https://codeday.me/bug/20191028/1951882.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有