标签: libstdc++

使用区域设置和流的 mbsrtowcs 和 wcsrtombs 的 C++ 等效项

是否有使用 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 时不考虑这一点的函数将无法工作。

c++ linux locale internationalization libstdc++

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

cmake 检测哪个库 libc++ 或 libstdc++ 配置为针对 g++ 或 clang++ 使用

我编写了一个使用或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)

gcc cmake clang libstdc++ libc++

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

在 CentOS 7 上构建时如何链接 devtoolset-7 中的 libstdc++?

我想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 作为构建系统。

g++ libstdc++ c++11 devtoolset centos7

5
推荐指数
0
解决办法
1492
查看次数

当 filesystem::path 被破坏时程序崩溃

以下程序崩溃:

#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)

c++ libstdc++ c++17 std-filesystem

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

抛出“std::system_error”实例后调用终止

当我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)

c++ multithreading libstdc++ c++11

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

C++20 &lt;chrono&gt; 嵌套名称说明符中使用的不完整类型

现在,支持新日历和时区功能的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}\n
Run Code Online (Sandbox Code Playgroud)\n

使用以下内容编译:

\n
> /usr/local/gcc-11.1.0/bin/g++-11.1 -std=c++-20 main.cpp\n
Run Code Online (Sandbox Code Playgroud)\n

给出以下错误:

\n
main.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      | \n
Run 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\n
Run Code Online (Sandbox Code Playgroud)\n

但我收到同样的错误消息。

\n

一些额外信息:

\n
> /usr/local/gcc-11.1.0/bin/g++-11.1 --version\n
Run Code Online (Sandbox Code Playgroud)\n

给出以下输出: …

c++ gcc libstdc++ c++-chrono c++20

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

C++ 中的内部实现 std::find

我注意到内部实现的 std::find 中的一些东西让我感到困惑;他们为什么这么做?

\n

std::find(begin,end,...)假设这一行,那么在文件的内部实现中stl_algobase.h,Line:2064是:

\n
\xc2\xa0 \xc2\xa0 \xc2\xa0 typename iterator_traits<_RandomAccessIterator>::difference_type\n\xc2\xa0 \xc2\xa0 __trip_count = (__last - __first) >> 2;\n
Run Code Online (Sandbox Code Playgroud)\n

这里发生了什么?为什么他们一起做减法然后使用移位运算符?我不明白他们为什么这样做?(抱歉,如果这是初学者的问题。)

\n

c++ libstdc++ c++17

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

"`GLIBCXX_3.4.32' not found" error at runtime. GCC 13.2.0

我在 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++ 链接,或者可能根本没有正确构建。我该如何修复这个错误?谢谢。

c++ linux gcc libstdc++

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

如何链接特定的库(g ++; libstdc ++.so.5和libstdc ++.so.6)

一个简单的问题 - 有没有办法让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)

linker g++ libstdc++

4
推荐指数
1
解决办法
9955
查看次数

与cuda相关的libstdc ++.so.6的链接器问题

今天我遇到了链接我编译的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)

c++ cuda libstdc++

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