Boost.Program_options是一个C ++库,允许程序开发人员通过命令行和配置文件等常规方法从用户获取(名称,值)对。
MCVE是: #include #include #include #include #include Mcve是: #include <iostream> #include <locale> #include <boost/filesystem.hpp> #include <boost/program_options.hpp> #include <boost/program_options/detail/utf8_codecvt_facet.hpp> int main() try { std::locale defLocale{}; auto converter = new boost::program_options::detail::utf8_codecvt_facet{}; auto customUtf8Locale = std::locale{ defLocale, converter}; std::locale::global(customUtf8Locale); std::cout << "Setting boost::filesystem::path::imbue locale..." << std::endl; boost::filesystem::path::imbue(customUtf8Locale); return 0; } catch(const std::exception& e) { std::cerr << "Exception " << e.what() << std::endl; return 1; } https://godbolt.org/z/n8ag4dhez 本简单的代码与静态编译和链接的Boost 1.86编译。 我使用附属物部署我的应用程序。 假设在多个Linux发行版上没有问题的工作:Redhat Enterprise Linux(RHEL)7.9+,CentOS 7.9+,Ubuntu 18.04+,Debian 10+,Suse Linux Enterprise Server(SLES)15,Oracle Linux 8,Amazon Linux 2,Amazon Linux 2,Amazon Linux 2,Amazon Linux 2,Amazon Linux 2, Amazon Linux 2023,Alma Linux 8+,Rocky Linux 8+,Linux Mint 20+。而且我没有任何(几乎)抱怨。 问题仅出现在CentOS 7.9+上(我在VM中复制问题)。 抛出了例外,在日志中,我可以看到: Setting boost::filesystem::path::imbue locale... Exception locale::facet::_S_create_c_locale name not valid 这是奇怪的事情,因为我的自定义语言环境是由默认构造的环境(Feeding“ c”语言名称给出相同结果)和自定义编码转换器的。我不用名称喂养任何地方。 为什么它失败了?以及我如何修复它? 我很难弄清楚这一点,因为这是在ubunbtu上建立的24.04,clang 18,然后部署在CentOS上,并设置了带有完整符号的调试会话,并且代码有点复杂。 reproducer:docker run --rm -i -t centos:7,然后: sed -i s/mirror.centos.org/vault.centos.org/g /etc/yum.repos.d/*.repo sed -i s/^#.*baseurl=http/baseurl=http/g /etc/yum.repos.d/*.repo sed -i s/^mirrorlist=http/#mirrorlist=http/g /etc/yum.repos.d/*.repo sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-* yum install -y git gcc-c++ make cmake boost boost-devel cat > test.cpp <<CPP #include <boost/filesystem.hpp> #include <boost/program_options.hpp> #include <boost/program_options/detail/utf8_codecvt_facet.hpp> #include <iostream> #include <locale> int main() try { std::locale defLocale{}; auto customUtf8Locale = std::locale( // defLocale // , new boost::program_options::detail::utf8_codecvt_facet{} // ); std::locale::global(customUtf8Locale); std::cout << "Setting boost::filesystem::path::imbue locale..." << std::endl; boost::filesystem::path::imbue(customUtf8Locale); } catch (std::exception const& e) { std::cerr << "Exception " << e.what() << std::endl; return 1; } CPP 现在建筑和跑步正常: g++ -std=c++11 test.cpp -lboost_{system,filesystem,program_options} 您欢迎您在问题中添加信息,以突出显示您在做什么不同。
boost::program_options 验证每个参数而不是每个参数类型?
boost::program_options 似乎支持某种程度的自定义验证,但对我来说,验证是按照类型而不是按参数编写的,这似乎很奇怪,我想知道我是否错了......
boost::program_options 中没有长参数的短参数
是否可以使用 boost::program_options 仅使用短选项指定参数? 这里给出的答案是使用allow_long_disguise,这将导致长选项可以接受......
Boost::program_options 在实现具有多种模式的程序时出现“选项不能被指定多次”错误
我正在尝试使用以下命令行用法创建一个程序: test_program [常规选项] 或者 test_program [常规选项] --toggle-
Boost program_options:混合位置参数和命名参数
我正在使用 boost::program_options 来制作一个简单的可执行文件,其通用语法如下: 程序 --命令 [参数] 例如: 程序--命令运行--监听locahost--端口80...
如何使用Boost.Program_options实现子命令?
我想在我的程序中实现子命令。我还需要能够为不同的子命令提供不同的参数选项。使用 Boost.Program_options 执行此操作的最佳方法是什么?
我是 C++ 新手,尝试使用 Boost 的program_options 标头来创建位置选项的向量,但无论我做什么,我似乎都无法实际执行任何操作或迭代...
我的应用程序的 Boost 程序选项如下。 命名空间 po = boost::program_options; desc.add_options() ( "logFile,l" , po::value(&logFilename)->
愚蠢的问题(但我在 boost.org 上没有找到任何内容):如何从 boost::program_options 捕获异常?调用 #包括 #包括 国际马...
通过索引运算符插入boost::program_options::variables_map
我有一个 boost::program_options::variables_map 参数。现在我想像键值对一样手动插入到这个映射中。 例子: boost::program_options::variables_map args args["文档"] = "A";
Boost.program_options 仅在向解析器添加位置选项后才会默默失败
我正在尝试使用 Boost.program_options,但位置参数不起作用。我是这方面的新手。 #include "应用程序.h" #包括 #包括 #include...
我如何在帮助消息末尾提供一些有关如何使用不同增强程序选项的示例? 我知道我可以使用 options_description 添加描述但是我怎样才能添加一些选项...
使用 boost program_options 期望提供的 CLI 参数的特定顺序
假设我们有以下 boost::program_options-specific 选项描述: po::options_description main_desc("Usage: my_app [--version] OBJECT { COMMAND | --help } “ ...
处理Boost程序_options中Config文件中的无值选项。
这个问题以前有人问过--Boost parse_config_file,空键值。但由于没有提供适当的解决方案,我再次问这个问题,希望有人能... ...
分割向量<string>选项的值,在boost program_options中。
我正在做一个通过配置文件读取一些选项的应用程序。代码使用 boost program_options 库来读取选项。应用程序的代码中有一个类,它做了以下工作......
我正在将std :: string传递给boost函数,该函数采用对该类型的const引用,但该值是突变的
我正在将std :: string传递给从boost-program-options dll导入的函数。该函数采用一个参数,并且是对字符串的const引用。但是,函数接收的值...
boost :: program_options在指定了意外的位置参数时不报告错误
这里是一个使用boost解析选项的简单程序:#include #include namespace po = boost :: program_options; int main(int argc,char ** argv){...
少数不是标头的Boost库之一(因此需要单独编译)是program_options。我需要在没有Boost的群集中的PC上运行我编译的程序...
boost:bad_any_cast:使用boost:any_cast错误转换失败
遇到Boost程序选项的问题。我添加了一个多用途选项,我们称之为“ --opt”。当我从命令行使用两个“ --opt”运行program.exe时,出现以下错误...
将boost program_options作为git子模块添加,并使用其源代码构建可执行文件
我有一个使用boost :: program_options的小项目。我想将此库(仅此库)作为git子模块添加到我的项目中,并使用其源代码构建可执行文件。我已经完成了git ...