boost 相关问题

Boost是一系列旨在用于C ++的高质量库。 Boost是免费的,通常被认为是“第二标准库”。

有没有更好的方法来检查boost共享内存段是否存在?

我能看到如何做到这一点的唯一方法是尝试访问它并捕获抛出的异常(如果它不存在)。 布尔值存在() { 使用命名空间 boost::interprocess; 尝试 { ...

回答 3 投票 0

使用 CMake 将多个测试源文件编译为单个合并文件

我有一个库,其中有许多不同的 cpp 测试文件。 它们看起来像这样,A.cpp、B.cpp、C.pp 等。 A.cpp: #define BOOST_TEST_MODULE "C++ 单元测试 A" #包括 我有一个包含许多不同 cpp 测试文件的库。 它们看起来像这样,A.cpp、B.cpp、C.pp等等 A.cpp: #define BOOST_TEST_MODULE "C++ Unit Tests A" #include<boost/test/unit_test.hpp> #include <multi/array.hpp> BOOST_AUTO_TEST_CASE(test_case_A1) { ... } B.cpp: #define BOOST_TEST_MODULE "C++ Unit Tests B" #include<boost/test/unit_test.hpp> #include <multi/array.hpp> BOOST_AUTO_TEST_CASE(test_case_B1) { ... } 我有以下 Cmake 代码要编译和测试 include(CTest) file( GLOB TEST_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp ) foreach(TEST_FILE ${TEST_SRCS}) set(TEST_EXE "${TEST_FILE}.x") add_executable(${TEST_EXE} ${TEST_FILE}) target_link_libraries(${TEST_EXE} PRIVATE multi) target_include_directories(${TEST_EXE} PRIVATE ${PROJECT_SOURCE_DIR}/include) target_include_directories(${TEST_EXE} SYSTEM PRIVATE ${Boost_INCLUDE_DIRS} ) target_link_libraries (${TEST_EXE} PRIVATE Boost::unit_test_framework ) endforeach() 这样做的问题是每个测试都需要一些时间来编译。 我知道如果我合并所有这些 cpp 文件,总体编译速度会更快。 (例如,我有 40 个 cpp 测试文件,每个需要 10 秒,总编译时间为 400 秒。如果我合并所有文件,可能需要 20 秒。即使我可以并行化单个文件的构建,也很难实现 20 倍的因子.显然编译器做了很多重复的工作。据说 gch 预编译头会有所帮助,但我从来没有弄清楚如何在 cmake 中使用它们)。 有没有办法强制这些测试的编译在单个合并文件上工作? 我尝试用这个替换循环: add_executable(multi_test ${TEST_SRCS}) add_test(NAME multi_test COMMAND ./multi_test) target_include_directories(multi_test PRIVATE ${PROJECT_SOURCE_DIR}/include) target_include_directories(multi_test SYSTEM PRIVATE ${Boost_INCLUDE_DIRS} ) target_link_libraries (multi_test PRIVATE Boost::unit_test_framework ) 但是,它仍然存在两个问题: 首先,编译仍然很慢,因为每个 cpp 都用于生成单独的 .o 文件(稍后链接到相同的可执行文件)。 第二个问题是每个 .o 将包含一个 main 函数(由 Boost.Test 定义),因此会出现链接器错误。 我可以进行更改来编译多个 cpp 文件,就好像它是单个 cpp 文件一样吗? (我想避免手动生成临时合并文件) 有 Boost.Test 标志可以帮助我解决这个问题吗? 我想要一个解决方案,其中每个测试源文件仍然可以编译成自己的可执行文件。 作为示例,我能够执行此过程来获取单个文件。 echo '#define BOOST_TEST_MODULE "C++ Unit Tests for Multi, All in one"' > ../test/all.cpp # Boost Test need a module name cat ../test/*.cpp | grep -v BOOST_TEST_MODULE >> ../test/all.cpp # filter macros to avoid warnings 您可以通过 #define BOOST_TEST_MODULE "C++ Unit Tests <...>" 命令执行target_compile_definitions操作,这在这里很有用,因为您想为用户提供是否对单个可执行文件或单个可执行文件一起构建测试的选项。 这样做的问题是每个测试都需要一些时间来编译。我知道如果我合并所有这些 cpp 文件,总体编译速度会快得多。 [...] 据说 gch 预编译标头会有所帮助,但我从未弄清楚如何将它们与 CMake 一起使用)。 有关在 CMake 中使用预编译头的信息,请参阅 target_precompile_headers 命令。但是,您正在寻找的连接源文件进行编译的方法,就好像它们是单个源文件一样,并且有一个名称:“Unity Build”。 CMake 甚至还提供了支持它的功能:其UNITY_BUILD目标属性。请阅读文档并了解建议如何正确使用它,以及在将统一构建技术与任何构建工具一起使用时可能出现的 ODR 违规的一般注意事项。 解决方案可能看起来像这样(用引号引起来,因为它主要取自您的问题帖子和您在聊天中写的内容): include(CTest) file( GLOB TEST_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp ) option( TEST_UNITY_BUILD "whether to create a single executable for all tests (instead of one per test source file)" <default> # replace <default> with desired default value ) if("${TEST_UNITY_BUILD}") foreach(TEST_FILE ${TEST_SRCS}) set(TEST_EXE "${TEST_FILE}.x") add_executable(${TEST_EXE} ${TEST_FILE}) target_link_libraries(${TEST_EXE} PRIVATE multi) target_include_directories(${TEST_EXE} PRIVATE ${PROJECT_SOURCE_DIR}/include) target_include_directories(${TEST_EXE} SYSTEM PRIVATE ${Boost_INCLUDE_DIRS} ) target_link_libraries (${TEST_EXE} PRIVATE Boost::unit_test_framework ) target_compile_definitions(${TEST_EXE} PRIVATE BOOST_TEST_MODULE="C++ Unit Tests for ${TEST_FILE}") endforeach() else() add_executable(multi_test ${TEST_SRCS}) set_property(TARGET multi_test PROPERTY UNITY_BUILD ON) target_include_directories(multi_test PRIVATE ${PROJECT_SOURCE_DIR}/include) target_include_directories(multi_test SYSTEM PRIVATE ${Boost_INCLUDE_DIRS} ) target_link_libraries (multi_test PRIVATE Boost::unit_test_framework ) target_compile_definitions(multi_test PRIVATE BOOST_TEST_MODULE="C++ Unit Tests for Multi GLOBAL TEST") add_test(NAME multi_test COMMAND ./multi_test) endif() 请注意,CMake 的维护者以及 Stack Overflow 上的各种 CMake 长期用户不鼓励使用 file(GLOB),如此处和此处所示。您可以手动定义文件列表,如 set(TEST_SRCS A.cpp B.cpp C.cpp ...)。 另请注意,如果您使用 file(GLOB),则对于 CMake v3.6 之前的版本,结果变量中的顺序文件未指定,而对于 3.6 及更高版本,则指定为字典顺序。 (参见 file(GLOB) 文档),它与 CMake 的统一构建功能相关。引用自UNITY_BUILD文档: 通过 add_library()、add_executable() 或 target_sources() 等命令添加到目标的源文件的顺序将保留在生成的 Unity 源文件中。这可用于根据 UNITY_BUILD_BATCH_SIZE 目标属性手动强制执行特定分组。 您可能还对 create_test_sourcelist 感兴趣,它将许多测试链接到一个可执行文件中。

回答 1 投票 0

包括使用 Visual Studio Code 在 Windows 上进行 C++ Boost

我想在 Visual Studio Code 中包含并使用 boost 库 (https://www.boost.org/)。这是我的测试.cpp: 在 VS Code 中运行代码后出现错误,箭头位于右上角

回答 1 投票 0

在 mac os x 中未找到 boost 标头问题

虽然包含 boost 标头,但我收到如下未找到错误 - 致命错误:boost/config.hpp:没有这样的文件或目录 #包括 我使用的是 Mac OS X 10...

回答 4 投票 0

使用Boost计算百分位(P50、P95)

我正在尝试计算 P50 和 P95 以用于整数流列表。这是一个示例代码:Live On Compiler Explorer #包括 #包括 我正在尝试计算 P50 和 P95 以用于整数流列表。这是示例代码:Live On Compiler Explorer #include <boost/accumulators/accumulators.hpp> #include <boost/accumulators/statistics.hpp> #include <boost/accumulators/statistics/extended_p_square_quantile.hpp> namespace ba = boost::accumulators; int main() { std::vector<int> values = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; std::vector<double> probs = {0.5, 0.95}; ba::accumulator_set<int, ba::stats<ba::tag::extended_p_square_quantile>> // acc(ba::extended_p_square_probabilities = probs); for (auto val : values) { acc(val); } std::cout << "P: " << ba::quantile(acc, ba::quantile_probability = 0.5) << " " << ba::quantile(acc, ba::quantile_probability = 0.95) << std::endl; } 但这返回了意想不到的值: P: 3 7 我预计答案是5 9。我怎样才能得到我想要的东西? 统计数据为估计值。您不仅应该期望不同的值。也许 95% 的百分位数估计应该更接近 10。 您可以通过测试程序的扩展来看到它的工作原理: 住在Coliru #include <boost/accumulators/accumulators.hpp> #include <boost/accumulators/statistics.hpp> #include <boost/accumulators/statistics/extended_p_square_quantile.hpp> namespace ba = boost::accumulators; namespace tag = ba::tag; template <typename... T> using Accum = ba::accumulator_set<int, ba::stats<T...>>; template <typename... T> Accum<T...> make() { std::vector<double> probs = {0.5, 0.95}; // unused arguments are ignored return Accum<T...>(ba::extended_p_square_probabilities = probs, tag::p_square_cumulative_distribution::num_cells = 11); } int main() { std::vector<int> values = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; auto simple = make<tag::median>(); auto p_sq_est = make<tag::with_p_square_cumulative_distribution_median>(); auto acc = make<tag::extended_p_square_quantile_quadratic>(); for (int i = 0; i < 100; ++i) { for (auto val : values) { simple(val); p_sq_est(val); acc(val); } printf("P: %6.3f %6.3f simple: %6.3f p_sq_est: %6.3f\n", // ba::quantile(acc, ba::quantile_probability = 0.50), // ba::quantile(acc, ba::quantile_probability = 0.95), // ba::median(simple), ba::median(p_sq_est)); } } 印刷: P: 3.000 7.000 simple: 5.000 p_sq_est: 6.000 P: 5.500 9.000 simple: 5.231 p_sq_est: 6.281 P: 5.286 9.433 simple: 5.448 p_sq_est: 6.004 P: 5.460 9.688 simple: 5.346 p_sq_est: 6.136 P: 5.396 9.835 simple: 5.285 p_sq_est: 6.184 P: 5.353 9.835 simple: 5.240 p_sq_est: 6.201 P: 5.321 9.910 simple: 5.204 p_sq_est: 6.166 P: 5.297 9.951 simple: 5.175 p_sq_est: 6.263 // ... P: 5.130 10.000 simple: 5.011 p_sq_est: 6.523 P: 5.129 10.000 simple: 5.011 p_sq_est: 6.511 P: 5.129 10.000 simple: 5.011 p_sq_est: 6.511 P: 5.129 10.000 simple: 5.011 p_sq_est: 6.517 P: 5.129 10.000 simple: 5.011 p_sq_est: 6.511

回答 1 投票 0

使用 boostspirit 识别带双括号的令牌字符串时遇到问题

解析字符串时: 1815 ((sd-pam)) S 1778 1778 1778 ... 我试图省略“((sd-pam))”标记 我使用了以下内容: omit_string %= lexeme['(' >> +(char_ - ')') >> '...

回答 1 投票 0

未内联时Boost系统分段错误

所以我尝试在我的应用程序中基于Boost System添加我自己的error_code。 基本上,我首先尝试遵循文档: https://www.boost.org/doc/libs/1_83_0/libs/system/doc/html/system...

回答 1 投票 0

将utf8转换为utf32

我真的无法在网上找到任何帮助!就像我在许多c++23程序中看到的那样,我想做的是: for(char32_t c : utf8string | utf8to32()) 这样我就可以处理每个单独的代码...

回答 1 投票 0

Conda cxx-编译器,尽管 cmake 找到了 boost,但找不到 boost 头

我有一个 conda 环境,我安装了:cmake、cxx-compiler、make 和 boost。我想编译一个我写的程序。如果我使用系统编译器,它工作正常,但我想创建一个 conda

回答 1 投票 0

如何在boost c++中从偏斜高斯分布中随机采样?

我正在尝试使用 Mersenne Twister 伪随机生成器对偏高斯分布进行采样。我使用 boost,因为偏高斯分布没有在 C++ 标准中实现。

回答 1 投票 0

C++程序找不到boost

我正在尝试编译MultiNEAT项目(https://github.com/peter-ch/MultiNEAT)。我已经安装了boost和boost-python,它位于/usr/local/Cellar/boost。我还编辑了~/.bash_pr...

回答 1 投票 0

如何使用 boost 和 openssl 验证 ssl 证书

我需要将数据推送到服务器,并且数据需要安全地传输。 我正在使用 lib boost。 // SSL 上下文是必需的,并且保存证书 ssl::context ctx(ssl::context::tlsv13_clie...

回答 1 投票 0

b2 的命令参数,以便使用 Microsoft 的 Clang/C2 构建 Boost 库

我一直在尝试在 Windows 中使用 b2 编译 Boost 库,但使用 Clang/C2(带有 Microsoft CodeGen 的 Clang 3.7),但没有成功。由于 Visual Studio 附带了多个可在构建时使用的工具集

回答 2 投票 0

无法使用boost/asio在C++中启动服务器

我试图在Windows上使用boost/asio编写一个简单的服务器,但是编译器抛出错误“Exception throwing at 0x00007FF90EE05B0C in Server.exe: Microsoft C++ exception: boost::

回答 1 投票 0

如何在c++中使用boost获得定时器功能?

我的应用程序是一个多线程应用程序,我创建一个线程,该线程不断读取套接字上的数据以连续检查来自服务器的通知,其他线程在 ev 之后向服务器发送请求...

回答 3 投票 0

如何确定A->B线是否位于多边形内而不碰到任何墙壁?

好的,系好安全带。 给定一个由点 A 和 B 以及多边形 C 构成的线串,我如何确保 A->B 线不与 C 中的任何墙壁相交或位于 C 内部? #包括...

回答 1 投票 0

CGAL K-D 树 - 在范围搜索时如何将信息关联到点?

我正在使用 CGAL 在正方形上随机生成点,我想为每个点分配一个任意的 int 值。目标是使用 Fuzzy_sphere 进行范围搜索。我的代码运行时没有添加 int

回答 1 投票 0

来自 boost 的警告

我收到很多来自 boost 库标头的警告,有什么方法可以解决这个问题吗? libs/boost/include/boost/numeric/ublas/detail/vector_assign.hpp:382:39:警告:typedef“引用”lo...

回答 2 投票 0

使用空容器增强序列化

我正在使用 boost ( 1.69.0 ) 序列化来生成 XML 模板文件。 不幸的是我想要达到的结果很糟糕。 这是示例代码: 结构A { 结构B { int bInt;...

回答 1 投票 0

std::is_copy_assignable 和 boost::Optional 的意外行为

如果我删除 Bar 类型的复制构造函数和/或复制赋值构造函数, 结构栏{ 酒吧()=默认; 栏(栏常量&)=删除; }; std::可选 不是复制-

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.