小编ami*_*421的帖子

捕获lib(单元测试)和CTest(CMake)集成

我正在寻找Catch CatchLib与CMake测试(Ctest)集成的成功示例.据我所知这是另外的cmake脚本,它必须解析应用程序输出?有人写过这个吗?可能分享了这个?

==================================================

更新(已找到解决方案):

我已经向CatchLib 提交了cmake脚本,用于集成Catch与CTest.这是Fraser99的CMake的脚本的简化版本,在这里

c++ unit-testing cmake ctest catch-unit-test

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

从CMake脚本构建doxygen

我在Web上找到了一个示例cmake文件,并将其放在/doc我的项目的子目录中,该文件myproject.doxgen也位于该文件中,其中包含Doxygen配置.

我已经测试了运行doxygen.exe myproject.doxygen产生的有效输出.我只需要将其构建到CMake过程中.所以/doc/CMakeLists.txt是:

find_package(Doxygen)
option(BUILD_DOCUMENTATION "Create and install the HTML based API        
documentation (requires Doxygen)" ${DOXYGEN_FOUND})

if(BUILD_DOCUMENTATION)
    if(NOT DOXYGEN_FOUND)
         message(FATAL_ERROR "Doxygen is needed to build the documentation.")
    endif()

    set(doxyfile_in ${CMAKE_CURRENT_SOURCE_DIR}/../doc/myproject.doxygen)
    set(doxyfile ${CMAKE_CURRENT_BINARY_DIR}/doxyfile)

    configure_file(${doxyfile_in} ${doxyfile} @ONLY)

    message("Doxygen build started.")

    add_custom_target(doc
                      COMMAND ${DOXYGEN_EXECUTABLE} ${doxyfile_in}
                      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/doc
                      COMMENT "Generating API documentation with Doxygen"
                      VERBATIM)

    #    install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html DESTINATION     share/doc)
endif()
Run Code Online (Sandbox Code Playgroud)

它不适用于我,它只复制原始配置文件,/build/my/project/doc/并且不做任何其他操作.

我想要的是在我的构建期间生成doxygen文档; 理想情况下,仅在构建Release配置时.

doxygen cmake

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

如何克隆和集成外部(从git)cmake项目到本地项目

当我尝试使用Google Test时,我遇到了一个问题.

有很多关于如何使用ExternalProject_Addgtest添加到项目中的手册,但是大多数这些手册描述了一种基于使用gtest下载zip存档并构建它的方法.

我们知道gtest是github托管和基于cmake的项目.所以我想找到原生的cmake方式.

如果这是一个仅限标题的项目,我会写一些类似于:

cmake_minimum_required(VERSION 2.8.8)
include(ExternalProject)
find_package(Git REQUIRED)

ExternalProject_Add(
    gtest
    PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/ext
    GIT_REPOSITORY https://github.com/google/googletest.git
    TIMEOUT 10
    UPDATE_COMMAND ${GIT_EXECUTABLE} pull
    CONFIGURE_COMMAND ""
    BUILD_COMMAND ""
    INSTALL_COMMAND ""
    LOG_DOWNLOAD ON
)

ExternalProject_Get_Property(gtest source_dir)
set(GTEST_INCLUDE_DIR ${source_dir}/googletest/include CACHE INTERNAL "Path to include folder for GTest")
set(GTEST_ROOT_DIR ${source_dir}/googletest CACHE INTERNAL "Path to source folder for GTest")
include_directories(${INCLUDE_DIRECTORIES} ${GTEST_INCLUDE_DIR} ${GTEST_ROOT_DIR})
message(${GTEST_INCLUDE_DIR})
Run Code Online (Sandbox Code Playgroud)

并从我的cmake项目添加此脚本,如:

 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake.modules/")
 include(AddGTest)
....
 add_dependencies(${PROJECT_NAME} gtest)
Run Code Online (Sandbox Code Playgroud)

但是,这需要构建步骤.

该如何实施?

  1. 通过添加BUILD_COMMANDExternaProject_Add,并与生产库链接?
  2. 或者通过将gtest的cmakelists包含到我的项目中,如下所示:

add_subdirectory (${CMAKE_SOURCE_DIR}\ext\src\gtest\googletest\CMakeLists.txt)

这是不正确的方法,因为在项目加载的那一刻文件夹不存在.

  1. 还有其他方法吗?

什么是正确/偏好的方式?

c++ git cmake googletest

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

从开发人员角度看Linux文件夹结构

我对Linux文件系统比较陌生,所以你能帮助我吗?我必须使用Ubuntu编写一个示例C++项目(测试).
你能从开发人员的角度用文件/文件夹结构来澄清我吗?以下是我想回答的一些问题:

  • 项目的典型位置(来源,目标文件等)在哪里?
  • 开发环境的典型位置(Eclipse,QT Creator等)在哪里?
  • 图书馆的典型地方在哪里?二进制文件和仅标题库是否有不同的位置?
  • 各种开发工具(代码分析器,git客户端等)的典型位置在哪里?

答案和链接将不胜感激.谢谢.

c++ linux

6
推荐指数
3
解决办法
4402
查看次数

std :: transform中的分段错误

我正在尝试将解析出的文件名从正则表达式匹配转移到filesystem::path对象列表.

我相信匹配是有效的,因为for_each对于相同的迭代器和打印到控制台工作完美.但是,我遇到运行此代码的分段错误.我究竟做错了什么?我的lambda有错吗?

        namespace fs = boost::filesystem;
        std::forward_list<fs::path> results;
        std::transform(std::sregex_iterator(file_data.begin(), file_data.end(), re),
                       std::sregex_iterator(), results.begin(),
                       [&](const std::smatch& m)->fs::path{
            return root / fs::path(m[1].str());
        });
Run Code Online (Sandbox Code Playgroud)

GDB向我展示了这一行作为错误的地方:

path& operator=(const path& p)
{
  m_pathname = p.m_pathname;
  return *this;
}
Run Code Online (Sandbox Code Playgroud)

更新:找到解决方案 - 使用back_inserter(results)而不是results.begin().但是,为什么呢?

c++ regex lambda boost-filesystem

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

如何在qt creator中使用clang静态分析器

请参阅本手册在Qt Creator手册中使用Clang Static Analyzer

谁能告诉我设置这个?我没有在QtCreator的分析器设置中看到此选项卡,也没有在列表中看到可用于此的插件...

更新:对不起,我看到这只是商业版

c++ qt-creator clang-static-analyzer

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

threadpool c ++实现问题

在这里这里,我们可以看到类似的线程池实现.

我的问题是关于将任务添加到线程池的功能,这些是分别在上面的项目中添加排队.

因为这些看起来非常相似我在这里张贴了一块(来自第二个项目)

auto ThreadPool::enqueue(F&& f, Args&&... args) 
-> std::future<typename std::result_of<F(Args...)>::type>
{
    using return_type = typename std::result_of<F(Args...)>::type;

    auto task = std::make_shared< std::packaged_task<return_type()> >(
        std::bind(std::forward<F>(f), std::forward<Args>(args)...)
    );

    std::future<return_type> res = task->get_future();
    {
        std::unique_lock<std::mutex> lock(queue_mutex);

    // don't allow enqueueing after stopping the pool
        if(stop)
            throw std::runtime_error("enqueue on stopped ThreadPool");

        tasks.emplace([task](){ (*task)(); });
    }
    condition.notify_one();
    return res;
}
Run Code Online (Sandbox Code Playgroud)

容器任务声明为:

std::queue< std::function<void()> > tasks;
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

  1. 为什么使用附加包装器std :: function声明的任务围绕任务变量?为什么任务的队列没有被声明为std :: packaged_task的容器,它也是一个可调用的对象?我认为任务队列应包含没有参数且没有返回类型的"通用"可调用对象.所以通过绑定实现删除参数,额外的包装器std :: function有助于删除返回类型,是正确还是不正确?还有关于shared_ptr的使用 - …

c++ concurrency multithreading threadpool

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

我应该在 Windows 上使用哪个链接器进行 clang

我只是想了解如何在 Windows 上使用 Clang/LLVM(而不是 Microsoft Clanf/C2 工具链)。

请澄清我的理解: 是该过程的描述。

我理解正确吗,要生成可执行文件,应该明确执行这些步骤:

  • clang.exe(前端编译器)
  • llc.exe(后端代码生成器)
  • lld.exe(链接器)

或隐含地:

  • 只是运行 clang.exe (它从自身运行其他工具)

但是,在上面的手册中,建议使用Microsoft Linker(link.exe),为什么?

  • 因为这个链接器可以生成 .pdb 文件以供 ms 调试器进行调试?link.exe 和 lld.exe 工作结果的唯一区别是什么?
  • 如果我无论如何都会使用 lld.exe - 这将为 win 平台生成有效的可执行文件,不是吗?
  • 如果我使用 lld - 这可以生成自己的格式调试信息以便在 Windows 上与 lldb 一起使用吗?

c++ llvm clang lldb

5
推荐指数
1
解决办法
4283
查看次数

lldb没有启动应用程序

这是我在lldb命令行模式下的第一次体验.不成功.

  1. 用clang,lld,lldb v5安装最小套件(ubuntu 16.04)
  2. 用clang构建的示例应用程序.
  3. 试图开始:

lldb applcation

>运行

错误:进程启动失败:无法找到lldb-server-5.0.0

所以现在问题:

  1. 为什么lldb试图运行服务器?这不是远程调试.
  2. 为什么lldb引用5.0.0(以及更改此设置的位置)?实际上,所有llvm实用程序都添加了符号链接automiticaly xxx-5.0后缀,但没有添加xxx-5.0.0.如果这指的是lldb-server本身,没有后缀,那将是合理的.
  3. 添加lldb-server-5.0.0符号链接并不能解决问题.

任何想法这应该如何工作?

顺便说一句额外的问题 - 似乎左/右/上/下箭头键在lldb控制台中不起作用?而不是光标移动它添加代码

(lldb)^ [[D ^ [[A ^ [[C ^ [[B.

c++ debugging llvm llvm-clang lldb

5
推荐指数
1
解决办法
676
查看次数

防止lambda的返回类型扣除

由于自动推导了lambda返回的类型,因此以下代码不可编译。

在没有尾随类型的情况下防止C ++ 14语法术语中这种推断的正确方法是什么?

编译错误与test()输入上的不兼容类型(右值)有关,该类型需要非常量引用

struct B {
    int i;
};

struct A {
    B &getB() { return b; }
private:
    B b;
};

void test(B &b)  {
    b.i++;
}

int main() {
    A a;

    test([&a]() { 
        return a.getB();
    });
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ auto return-type-deduction c++14

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