由于 __GLIBC__ 问题,无法在 macbook 中编译 c++ 代码

Posted

技术标签:

【中文标题】由于 __GLIBC__ 问题,无法在 macbook 中编译 c++ 代码【英文标题】:unable to compile c++ code in macbook due to __GLIBC__ issue 【发布时间】:2021-03-06 20:44:04 【问题描述】:

g++ -std=c++11 -Wall -g threads.cpp -o threads.out

In file included from threads.cpp:1:
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/iostream:37:
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/ios:215:
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/__locale:401:32: error: use of undeclared identifier '_ISspace'
    static const mask space  = _ISspace;
                               ^
Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/__locale:402:32: error: use of undeclared identifier '_ISprint'
    static const mask print  = _ISprint;
                               ^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/__locale:403:32: error: use of undeclared identifier '_IScntrl'
    static const mask cntrl  = _IScntrl;
                               ^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/__locale:404:32: error: use of undeclared identifier '_ISupper'
    static const mask upper  = _ISupper;
                               ^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/__locale:405:32: error: use of undeclared identifier '_ISlower'
    static const mask lower  = _ISlower;
                               ^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/__locale:406:32: error: use of undeclared identifier '_ISalpha'
    static const mask alpha  = _ISalpha;

您能否在编译 c++ 代码时帮我解决这个 __locale 问题。

#include <iostream>
#include <thread>
using namespace std;

void fun(void)

    cout << "Vaule " << 10 << endl;


int main()

    thread t1(fun);
    thread t2(fun);
    return 0;

编译命令: g++ -std=c++11 -Wall -g thread.cpp -o thread.out

【问题讨论】:

你试过用clang吗? 请显示g++ --version的输出。 除非它是从 hombrew(或其他包管理器)安装的,否则 macOS 上的 g++ 是 clang++ 的别名,它也使用较旧的标准库。我没有消息来源可以证实这一点,但考虑到它有时的行为方式,以及当你查看 g++ --version 时它吐出的信息,这对我来说似乎是一个合理的结论。试试 clang++ 看看是否还会出现。我不记得你是否需要在 macOS 上使用 -pthread 作为编译选项,但检查起来很快。 @G.M. ` sekharpa : g++ --version Apple clang 版本 12.0.0 (clang-1200.0.32.29) 目标:x86_64-apple-darwin20.3.0 线程模型:POSIX InstalledDir: /Library/Developer/CommandLineTools/usr/bin` @sweenish 我也试过用 clang 和 clang++ 编译,还是一样的问题。使用 -lptherad 编译后也会出现相同的错误。 【参考方案1】:

有两件事可以解决您遇到的问题。

首先,添加编译器选项-pthread。我的编译命令:clang++ -Wall -Wextra -std=c++11 -pthread main.cpp

第二件事,在结束程序之前加入你的线程。

    t1.join();
    t2.join();

它无法解决的问题是,您的 std::cout 语句可能会混乱,因为线程只是随意将其数据转储到单个流中。例如,我的输出如下:

Vaule Vaule 10
10

为了解决这个问题,您可能需要在 std::cout 语句周围放置一个锁(互斥锁)。

正如我在评论中所说,我不建议使用g++,除非您自己安装。您使用的命令是一个不起作用的别名,因为您遗漏了一些文本。

❯ g++ --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 12.0.0 (clang-1200.0.32.29)
Target: x86_64-apple-darwin20.3.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

对比clang++

❯ clang++ --version
Apple clang version 12.0.0 (clang-1200.0.32.29)
Target: x86_64-apple-darwin20.3.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

在 g++ 部分中值得注意的是“配置为”行。它使用来自 gcc 4.2.1 的标准库,它是 C++11 之前的版本。您不应该遗漏这些信息。

【讨论】:

我已经尝试了您提到的相同步骤。仍然得到同样的错误。我的 mac book 缺少一些配置,我不知道如何修复。

以上是关于由于 __GLIBC__ 问题,无法在 macbook 中编译 c++ 代码的主要内容,如果未能解决你的问题,请参考以下文章

glibc2.12升级glibc2.14源码

libc.so.6: version 'GLIBC_2.14' not found报错提示的解决方案

Redhat/CentOS - 找不到“GLIBC_2.18”

glibc的malloc钩子

解决Requires: libc.so.6(GLIBC_2.14)(64bit)错误解决方法

使用 ld 编译时出错:__stack_chk_guard@@GLIBC_2.17