相关疑难解决方法(0)

C++项目组织(使用gtest,cmake和doxygen)

我是一般编程的新手,所以我决定从C++中创建一个简单的向量类开始.但是我想从一开始就养成良好的习惯,而不是稍后尝试修改我的工作流程.

我目前只有两个文件vector3.hppvector3.cpp.随着我对一切事物越来越熟悉,这个项目将慢慢开始增长(使其更像是一般的线性代数库),因此我希望采用"标准"项目布局,以便以后更轻松.所以在环顾四周后,我发现了两种组织hpp和cpp文件的方法,第一种方法是:

project
??? src
    ??? vector3.hpp
    ??? vector3.cpp
Run Code Online (Sandbox Code Playgroud)

第二个是:

project
??? inc
?   ??? project
?       ??? vector3.hpp
??? src
    ??? vector3.cpp
Run Code Online (Sandbox Code Playgroud)

你会推荐哪个?为什么?

其次,我想使用Google C++测试框架对我的代码进行单元测试,因为它看起来相当容易使用.你认为在我的代码捆绑这一点,例如inc/gtestcontrib/gtest文件夹?如果捆绑了,您是否建议使用fuse_gtest_files.py脚本来减少数量或文件,或保留原样?如果没有捆绑,这个依赖是如何处理的?

在编写测试时,这些测试通常是如何组织的?我想为每个类创建一个cpp文件(test_vector3.cpp例如),但是所有编译成一个二进制文件,以便它们可以轻松地一起运行?

由于gtest库通常是使用cmake和make构建的,所以我认为我的项目也可以像这样构建吗?如果我决定使用以下项目布局:

??? CMakeLists.txt
??? contrib
?   ??? gtest
?       ??? gtest-all.cc
?       ??? gtest.h
??? docs
?   ??? Doxyfile
??? inc
?   ??? project
?       ??? vector3.cpp
??? src
?   ??? vector3.cpp
??? test
    ??? test_vector3.cpp
Run Code Online (Sandbox Code Playgroud)

如何CMakeLists.txt才能看到它只能构建库或库和测试?我也见过很多有a build和a …

c++ doxygen cmake googletest

115
推荐指数
4
解决办法
4万
查看次数

如何开始使用GTest和CMake

我最近因使用CMake编译我的C++项目而被出售,现在我想开始为我的代码编写一些单元测试.我决定使用Google Test实用程序来帮助解决这个问题,但在入门时需要一些帮助.

我一整天都在阅读各种指南和示例,包括Primer,IBM介绍以及有关SO(此处此处)的一些问题以及我已经忘记的其他来源.我意识到那里有很多,但不知怎的,我仍然遇到困难.

我目前正在尝试实施最基本的测试,以确认我已经编译/安装了gtest,并且它无法正常工作.唯一的源文件(testgtest.cpp)被认为几乎完全由前面的回答:

#include <iostream>

#include "gtest/gtest.h"

TEST(sample_test_case, sample_test)
{
    EXPECT_EQ(1, 1);
}
Run Code Online (Sandbox Code Playgroud)

和我关联的CMakeLists.txt如下:

cmake_minimum_required(VERSION 2.6)
project(basic_test)

# Setup testing
enable_testing()
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIR})

# Add test cpp file
add_executable(runUnitTests
    testgtest.cpp
)

# Link test executable against gtest & gtest_main
target_link_libraries(runUnitTests ${GTEST_LIBRARY_DEBUG} ${GTEST_MAIN_LIBRARY_DEBUG})

add_test(
    NAME runUnitTests
    COMMAND runUnitTests
)
Run Code Online (Sandbox Code Playgroud)

请注意,我选择链接gtest_main而不是在cpp文件的末尾提供main,因为我相信这将允许我更容易地将测试扩展到多个文件.

构建生成的.sln文件(在Visual C++ 2010 Express中)时,我很遗憾地得到了一个很长的表单错误列表

2>msvcprtd.lib(MSVCP100D.dll) : error LNK2005: "public: virtual __thiscall std::basic_iostream<char,struct std::char_traits<char> >::~basic_iostream<char,struct std::char_traits<char> >(void)" (??1?$basic_iostream@DU?$char_traits@D@std@@@std@@UAE@XZ) …
Run Code Online (Sandbox Code Playgroud)

unit-testing cmake googletest

113
推荐指数
4
解决办法
10万
查看次数

CMake:如何构建外部项目并包含其目标

我有一个项目A,它导出一个静态库作为目标:

install(TARGETS alib DESTINATION lib EXPORT project_a-targets)
install(EXPORT project_a-targets DESTINATION lib/alib)
Run Code Online (Sandbox Code Playgroud)

现在我想将项目A用作项目B的外部项目并包含其构建目标:

ExternalProject_Add(project_a
  URL ...project_a.tar.gz
  PREFIX ${CMAKE_CURRENT_BINARY_DIR}/project_a
  CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
)

include(${CMAKE_CURRENT_BINARY_DIR}/lib/project_a/project_a-targets.cmake)
Run Code Online (Sandbox Code Playgroud)

问题是当运行项目B的CMakeLists时,包含文件尚不存在.

有没有办法让include依赖于正在构建的外部项目?

cmake external-project

95
推荐指数
4
解决办法
8万
查看次数

如何在Linux上将googleTest设置为共享库

Debian不再为gTest提供任何预编译的包.他们建议您将框架集成到项目makefile中.但我想保持make文件干净.如何设置gTest像以前的版本(<1.6.0),以便我可以链接aganist库?

c++ linux installation unit-testing googletest

80
推荐指数
4
解决办法
9万
查看次数

单元测试输出和项目结构建议--- CMake + Google测试框架

我是CMake的新手,我正在使用Google Test Framework.我已经找到了将CMake和Google测试框架结合起来的更复杂的例子,但我没有太多运气.我希望有人可以就我到达的设置提出他们的意见并为我回答一个问题.这是基本的项目结构:

ProjectFolder
-CMakeLists.txt
/ build
/ include- all
  我的.h文件
/ src
  -CMakeLists.txt-
  所有我的.cpp文件
/测试
  -CMakeLists.txt
  / gtest
    -Google的CMakeLists.txt
  / mocks
    -CMakeLists.txt
    -cpp和h模拟文件

简而言之,根cmake文件将src和tests作为子目录添加.src cmake文件将cpp文件复制到库中.测试cmake文件添加了mocks和gtest作为子目录.模拟cmake文件将其所有cpp文件复制到第二个库中.最后,tests文件夹中的cmake文件将src库,google库和mocks库与单元测试可执行文件链接起来.

我最终得到的是几个可执行文件:objA_unittest,objB_unittest等

一些东西:

  1. 要构建所有这些并仍然保持我的项目目录相当干净我进入构建文件夹并运行"cmake .."这似乎工作得很好,我计划配置vim以始终运行make这个文件夹.有没有人有这方法的任何提示或看到任何问题?

  2. 我不喜欢在我的项目文件夹中嵌入谷歌库的想法(特别是如果我最终有几个项目使用它),但是因为它似乎强烈建议您不要预编译谷歌库我可以看到没办法解决这个问题.但是,如果有人知道更好的方式,我很乐意听到它.

  3. 运行测试.我喜欢我所要做的就是运行"make test"来用ctest执行我的所有单元测试.但是,我发现我不太喜欢输出.每个单元测试可执行文件包含几个不同的单 直接运行这些提供了Google非常详细的反馈.如果可执行文件中的某个测试失败,我确切知道测试失败的原因和原因.以前,我使用了makefile,在makefile的末尾我只执行了所有的测试.我首先尝试通过在cmake中创建自定义构建目标来解决此问题.但是,它只执行第一个命令.我要么需要一种方法来从CTest获得更详细的输出,或者我需要一种方法来自动输出bash脚本或类似于CMake的东西来执行每个单元测试可执行文件.换句话说,我现在已经设置了cmake文件,所以我只需要在一个地方添加单元测试来生成可执行文件,我不想记得将它添加到第二个位置,如果我能避免的话它.有没有人有这方面的经验?

首先十分感谢.

cmake googletest

19
推荐指数
2
解决办法
1万
查看次数

如何在linux中配置和设置谷歌测试框架

我是g测试的新手,这是我想要做的事情(在Linux服务器上从控制台):1)用C++创建一个小项目(带有包含函数原型的头文件,带有函数的cpp文件)在它和另一个主调用已在头文件中定义的函数的cpp文件中)2)配置g测试以编写单元测试并测试在步骤1中创建的函数3)创建另一个带有几个单元测试的小项目(不同用于测试在步骤1)中在项目下创建的函数的方案

任何人都可以告诉我们如何配置g测试和用一个例子创建的项目?

提前致谢

c++ linux googletest vs-unit-testing-framework

6
推荐指数
1
解决办法
1万
查看次数

将google-test添加到CMake项目中的子文件夹

我刚刚将google-test源代码添加到libs/gtest-1.6.4项目目录中.有一个libs/gtest-1.6.4/CMakeLists.txt文件.在最顶层CMakeLists.txt,我补充说add_subdirectory('libs/gtest-1.6.4').该项目的结构是

|- CMakeLists.txt 
|- src 
   |- CMakeLists.txt 
   |- *.h and *.cc 
|- libs
   |- gtest-1.6.4
      |- CMakeLists.txt
      |- gtest source code etc.
|- other subdirectories 
Run Code Online (Sandbox Code Playgroud)

现在我添加#include "gtest/gtest.h"一个头文件.编译失败

gtest/gtest.h: No such file or directory
compilation terminated.
Run Code Online (Sandbox Code Playgroud)

这是我的src/CMakeLists.txt文件的片段.

set( Boost_USE_STATIC_LIBS ON )
find_package( Boost COMPONENTS graph regex system filesystem thread REQUIRED)

.. Normal cmake stuff ...
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS} )

# This line is added for google-test
INCLUDE_DIRECTORIES(${GTEST_INCLUDE_DIRS} ${COMMON_INCLUDES})

add_executable(Partitioner
  print_function.cc
  methods.cc …
Run Code Online (Sandbox Code Playgroud)

cmake googletest

3
推荐指数
1
解决办法
3980
查看次数

Google Test 单独项目 - 如何针对 C++ 项目运行测试

我想弄清楚如何使用 CMake 对我的 C++ 项目运行 Google 测试。到目前为止,我已经创建了一个名为 Simple 的项目和一个名为 SimpleTest 的 Google Test 项目。

对于简单项目

这是我的 CMakeLists.txt 文件:

cmake_minimum_required(VERSION 2.8.4)
project(Simple)

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

set(SOURCE_FILES
    main.cpp
    NewCppClass.cpp
    NewCppClass.h)

add_executable(Simple ${SOURCE_FILES})
Run Code Online (Sandbox Code Playgroud)

这是我的 main.cpp 文件:

#include <iostream>

#include "NewCppClass.h"

using namespace std;

int main() {
    NewCppClass newCppClass;
    int i = newCppClass.getNumberToTest();
    cout << "i = " << i;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是我的类标题:

#ifndef SIMPLE_NEWCPPCLASS_H
#define SIMPLE_NEWCPPCLASS_H

class NewCppClass {
    public:
        int getNumberToTest();

};

#endif //SIMPLE_NEWCPPCLASS_H
Run Code Online (Sandbox Code Playgroud)

这是我的 .cpp 文件:

#include "NewCppClass.h"

int NewCppClass::getNumberToTest() …
Run Code Online (Sandbox Code Playgroud)

c++ cmake googletest clion

3
推荐指数
1
解决办法
3297
查看次数