是否有使用 std::locale 和 C++ 流功能的 mbsrtowcs 和 wcsrtombs 类型函数的 C++ 等效项?
我试图找出使用标准库在 std::string 和 std::wstring 之间来回转换的最佳方法。似乎 std::locale 几乎可以做到这一点,但我对一些细节或它可能有哪些限制有点不确定。
一些细节:我使用的是 Linux,它使用 utf-8 作为本机编码。我想从 utf-8 std::string 到 std::wstring 并返回而不丢失信息。
我认为 Windows 上的区域设置可能存在一些限制,但我并不特别担心它们。只要答案在 Linux 上有效并且没有 libstdc++ 之外的依赖项,即没有 boost 依赖项,我就很高兴。
感谢背景信息的链接。
注意:似乎有些混乱。多个 char 可以代表 UTF-8 中的单个字符,因此在从 wchar_t 转换为 char 时不考虑这一点的函数将无法工作。
我编写了一个使用或CMakeLists.txt构建项目的方法。g++clang++
为了捕获尽可能多的错误,我同时使用libc++with -D_LIBCPP_DEBUG2=2(for clang++) 和libstdc++with -D_GLIBCXX_DEBUG(for Both g++and clang++)。
set(CMAKE_CXX_FLAGS_DEBUG "-ggdb -fno-inline -DDEBUG=1 -march=x86-64 -mtune=generic")
#[[
if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_LIBCPP_DEBUG2=2")
elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_GLIBCXX_DEBUG")
endif()
]]
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
elseif(CMAKE_BUILD_TYPE STREQUAL "Release")
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG=1 -march=native")
elseif(CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-fno-omit-frame-pointer -DNDEBUG=1 -march=native")
if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -O3 -gline-tables-only")
elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -Og -ggdb")
endif()
elseif(CMAKE_BUILD_TYPE STREQUAL "MinSizeRel")
set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os …Run Code Online (Sandbox Code Playgroud) 我想devtoolset-7在 CentOS 7 上构建 C++11 应用程序。我正在尝试使用该库,但CentOS 7 本身包含的<regex>版本4.8.4不支持它。libstdc++
我已按照以下说明安装并启用 SCL/ devtoolset-7:
$ sudo yum install centos-release-scl
$ sudo yum install devtoolset-7
$ scl enable devtoolset-7 bash
Run Code Online (Sandbox Code Playgroud)
此时,如果我调用g++,它就是正确的版本 (7.2.1),但是当我构建应用程序并在它们上运行时,它们仍然动态链接到系统上的ldd旧版本。/lib64/libstdc++.so.6可靠链接的最简单方法是什么devtoolset-7-libstdc++-devel-7.2.1?我使用 CMake 3 作为构建系统。
以下程序崩溃:
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;
int main()
{
fs::path p1 = "/usr/lib/sendmail.cf";
std::cout << "p1 = " << p1 << '\n';
}
Run Code Online (Sandbox Code Playgroud)
汇编:
$ g++ -std=c++17 pathExistsTest.cpp
$ ./a.out
p1 = "/usr/lib/sendmail.cf"
[1] 35688 segmentation fault (core dumped) ./a.out
Run Code Online (Sandbox Code Playgroud)
在 Ubuntu 20.04 上测试,编译器为 GCC 8.4.0。
Valgrind,这是切割输出:
==30078== by 0x4AE5034: QAbstractButton::mouseReleaseEvent(QMouseEvent*) (in /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5.12.8)
==30078== by 0x4A312B5: QWidget::event(QEvent*) (in /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5.12.8)
==30078== Address 0x2b is not stack'd, malloc'd or (recently) free'd
==30078==
==30078==
==30078== Process terminating with default action …Run Code Online (Sandbox Code Playgroud) 当我std::call_once在 Linux 2.6.36 版中使用时,出现错误:
terminate called after throwing an instance of 'std::system_error'
what(): Unknown error -1
Aborted
Run Code Online (Sandbox Code Playgroud)
编译命令:
mipsel-buildroot-linux-uclibc-g++ callonce.cpp -o callonce -static -lpthread
Run Code Online (Sandbox Code Playgroud)
我的代码:
#include <iostream>
#include <mutex>
using namespace std;
int main()
{
cout << "Hello world" << std::endl;
static once_flag of;
call_once(of,[]{});
return 0;
}
Run Code Online (Sandbox Code Playgroud) 现在,支持新日历和时区功能的GCC 11已发布,我正在尝试在我的代码中使用这些功能。
\n使用以下最小示例:
\n#include <chrono>\n#include <iostream>\n\nint main()\n{\n using namespace std;\n\n cout << chrono::utc_clock::now() << endl;\n\n return EXIT_SUCCESS;\n}\nRun Code Online (Sandbox Code Playgroud)\n使用以下内容编译:
\n> /usr/local/gcc-11.1.0/bin/g++-11.1 -std=c++-20 main.cpp\nRun Code Online (Sandbox Code Playgroud)\n给出以下错误:
\nmain.cpp: In function \xe2\x80\x98int main()\xe2\x80\x99:\nmain.cpp:8:36: error: incomplete type \xe2\x80\x98std::chrono::utc_clock\xe2\x80\x99 used in \n nested name specifier\n 8 | cout << chrono::utc_clock::now() << endl;\n | \nRun Code Online (Sandbox Code Playgroud)\n我调查了这个错误,它似乎通常源于前向声明。有谁知道为什么会发生这种情况?
\n我还尝试显式链接新建的 GCC 11 版本的 libstdc++.a:
\n/usr/local/gcc-11.1.0/bin/g++-11.1 -std=c++20 -L/usr/local/gcc-11.1.0/lib -lstdc++ main.cpp\nRun Code Online (Sandbox Code Playgroud)\n但我收到同样的错误消息。
\n一些额外信息:
\n> /usr/local/gcc-11.1.0/bin/g++-11.1 --version\nRun Code Online (Sandbox Code Playgroud)\n给出以下输出: …
我注意到内部实现的 std::find 中的一些东西让我感到困惑;他们为什么这么做?
\nstd::find(begin,end,...)假设这一行,那么在文件的内部实现中stl_algobase.h,Line:2064是:
\xc2\xa0 \xc2\xa0 \xc2\xa0 typename iterator_traits<_RandomAccessIterator>::difference_type\n\xc2\xa0 \xc2\xa0 __trip_count = (__last - __first) >> 2;\nRun Code Online (Sandbox Code Playgroud)\n这里发生了什么?为什么他们一起做减法然后使用移位运算符?我不明白他们为什么这样做?(抱歉,如果这是初学者的问题。)
\n我在 WSL 中使用 Ubuntu 22.04.3 LTS。我从源代码成功构建并安装了 GCC 13.2.0。这就是我的配置方式:
../gcc/configure --host=x86_64-pc-linux-gnu --disable-multilib --enable-languages=c,c++
Run Code Online (Sandbox Code Playgroud)
/usr/local/bin/g++经过所有正确的步骤后,g++ 已成功安装。但是当我尝试运行一个简单的 Hello World 应用程序时,出现以下运行时错误:
./hello: /lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.32' not found (required by ./hello)
Run Code Online (Sandbox Code Playgroud)
该程序似乎没有与最新构建的 libstdc++ 链接,或者可能根本没有正确构建。我该如何修复这个错误?谢谢。
一个简单的问题 - 有没有办法让g++链接器与特定的libstdc++库版本链接?我没有在gcc/ 的手册页中找到任何有用的东西g++,在这里也没有其他问题.
这是情况 - 我的应用程序使用一个特定的共享库,它是libstdc++.so.5用它构建的,我想安装并使用它RHEL5.所以,当我尝试在RHEL5机器上构建应用程序时,我收到了警告:
warning: libstdc++.so.5, needed by ..the_shared_library_.. may conflict with libstdc++.so.6
Run Code Online (Sandbox Code Playgroud)
安装compat-libstdc++rpm没有帮助,程序崩溃了析构函数std::string,因为无法解决.所以,在这RHEL5台机器上我有这个:
[root@xxx]# ll /usr/lib/libstd*
-rwxr-xr-x 1 root root 259532 Aug 21 2006 /usr/lib/libstdc++-3-libc6.2-2-2.10.0.so
lrwxrwxrwx 1 root root 31 Jul 28 19:35 /usr/lib/libstdc++-libc6.2-2.so.3 -> libstdc++-3-libc6.2-2-2.10.0.so
lrwxrwxrwx 1 root root 18 Aug 24 15:08 /usr/lib/libstdc++.so.5 -> libstdc++.so.5.0.7
-rwxr-xr-x 1 root root 733456 Aug 21 …Run Code Online (Sandbox Code Playgroud) 今天我遇到了链接我编译的cuda东西的问题.
我有一个最新的debian测试w/2.6.32-3-amd64.
我整天在我的代码上工作.不时编译.没问题.但是经过一次小的代码更改后我得到了以下错误:
gcc -o pa CUDA.o histogram256.o histogram64.o main.o -lrt -lm -lcudart -I. -I/data/cuda/include -I/data/cuda/C/common/inc -L/data/cuda/lib64
/usr/bin/ld: main.o: undefined reference to symbol 'std::basic_ifstream<char, std::char_traits<char> >::close()@@GLIBCXX_3.4'
/usr/bin/ld: note: 'std::basic_ifstream<char, std::char_traits<char> >::close()@@GLIBCXX_3.4' is defined in DSO /usr/lib64/libstdc++.so.6 so try adding it to the linker command line
/usr/lib64/libstdc++.so.6: could not read symbols: Invalid operation
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我改回了代码,但错误仍然存在.
lib就是应该存在的地方.(/ usr/lib64链接到/ usr/lib)
ldd /usr/lib/libstdc++.so.6
linux-vdso.so.1 => (0x00007fff31fff000)
libm.so.6 => /lib/libm.so.6 (0x00007f15f625a000)
libc.so.6 => /lib/libc.so.6 (0x00007f15f5ef9000)
/lib64/ld-linux-x86-64.so.2 (0x00007f15f680d000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 …Run Code Online (Sandbox Code Playgroud)