我在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配置时.
当我尝试使用Google Test时,我遇到了一个问题.
有很多关于如何使用ExternalProject_Add
gtest添加到项目中的手册,但是大多数这些手册描述了一种基于使用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)
但是,这需要构建步骤.
该如何实施?
BUILD_COMMAND
到ExternaProject_Add
,并与生产库链接?add_subdirectory (${CMAKE_SOURCE_DIR}\ext\src\gtest\googletest\CMakeLists.txt)
这是不正确的方法,因为在项目加载的那一刻文件夹不存在.
什么是正确/偏好的方式?
我对Linux文件系统比较陌生,所以你能帮助我吗?我必须使用Ubuntu编写一个示例C++项目(测试).
你能从开发人员的角度用文件/文件夹结构来澄清我吗?以下是我想回答的一些问题:
答案和链接将不胜感激.谢谢.
我正在尝试将解析出的文件名从正则表达式匹配转移到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()
.但是,为什么呢?
请参阅本手册在Qt Creator手册中使用Clang Static Analyzer
谁能告诉我设置这个?我没有在QtCreator的分析器设置中看到此选项卡,也没有在列表中看到可用于此的插件...
更新:对不起,我看到这只是商业版
我的问题是关于将任务添加到线程池的功能,这些是分别在上面的项目中添加和排队.
因为这些看起来非常相似我在这里张贴了一块(来自第二个项目)
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)
所以我的问题是:
我只是想了解如何在 Windows 上使用 Clang/LLVM(而不是 Microsoft Clanf/C2 工具链)。
请澄清我的理解: 这是该过程的描述。
我理解正确吗,要生成可执行文件,应该明确执行这些步骤:
或隐含地:
但是,在上面的手册中,建议使用Microsoft Linker(link.exe),为什么?
这是我在lldb命令行模式下的第一次体验.不成功.
lldb applcation
>运行
错误:进程启动失败:无法找到lldb-server-5.0.0
所以现在问题:
任何想法这应该如何工作?
顺便说一句额外的问题 - 似乎左/右/上/下箭头键在lldb控制台中不起作用?而不是光标移动它添加代码
(lldb)^ [[D ^ [[A ^ [[C ^ [[B.
由于自动推导了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++ ×9
cmake ×3
lldb ×2
llvm ×2
auto ×1
c++14 ×1
clang ×1
concurrency ×1
ctest ×1
debugging ×1
doxygen ×1
git ×1
googletest ×1
lambda ×1
linux ×1
llvm-clang ×1
qt-creator ×1
regex ×1
threadpool ×1
unit-testing ×1