【问题标题】:How do I compile with C++98 on MacOS?如何在 MacOS 上使用 C++98 进行编译?
【发布时间】:2021-11-04 05:04:39
【问题描述】:

我需要将 C++98 用于大学课程,但是即使将 -std=c++98 标志传递给 clang++ 或 g++,它似乎仍然可以使用 c++11 编译,并且如果我不给出错误使用 c++11 功能。这是一个简单的例子:

#include <string>
#include <sstream>
using namespace std;
int main()
{
    int i;
    string number = "12";
    i = stoi(number);
}

我的生成文件:

all:
    clang++ -std=c++98 -c *.cpp
    clang++ -o main *.o

clean:
    rm -f *.o main

run: clean all
    ./main

然后我从终端运行命令 make(我尝试使用 clang++ 而不是 g++,但它产生相同的结果)并收到以下输出:

➜  cppversion make
g++ -std=c++98 -c *.cpp
g++ -o main *.o
➜  cppversion make
clang++ -std=c++98 -c *.cpp
clang++ -o main *.o
➜  cppversion

如果 -std=c++98 标志有效,我相信这段代码不应该编译。如何强制代码用 c++98 编译?

这里是clang的版本:

Apple clang version 12.0.5 (clang-1205.0.22.11)
Target: x86_64-apple-darwin20.2.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin\

这里是g++的版本:

Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX11.1.sdk/usr/include/c++/4.2.1
Apple clang version 12.0.5 (clang-1205.0.22.11)
Target: x86_64-apple-darwin20.2.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

我也尝试添加标志 -pedantic 但它不能解决问题。

使用标志 -stdlib=libc++ 会产生以下结果:

➜  cppversion make
clang++ -stdlib=libstdc++ -std=c++98 -c *.cpp
clang: warning: include path for libstdc++ headers not found; pass '-stdlib=libc++' on the command line to use the libc++ standard library instead [-Wstdlibcxx-not-found]
main.cpp:1:10: fatal error: 'string' file not found
#include <string>
         ^~~~~~~~
1 error generated.
make: *** [all] Error 1

如果我将其更改为 -stdlib=libc++ 那么它仍然可以编译:

➜  cppversion make
clang++ -stdlib=libc++ -std=c++98 -c *.cpp
clang++ -o main *.o
➜  cppversion

我找到了一个简单的解决方案:使用 homebrew 安装 gcc 并使用 g++-11 编译。

【问题讨论】:

标签: c++ macos c++11 c++98


【解决方案1】:

尝试使用-std=c++98 -pedantic

这应该严格执行具体的标准。

【讨论】:

    【解决方案2】:

    免责声明:这部分是猜测,因为我没有 Mac

    据我了解,clang++ 是 Mac 上的默认编译器,因此即使 g++ 默认使用 LLVM:s libc++ 和标头,我也不会感到惊讶。 std::stoilibc++ 标头中无条件声明。

    如果你改用g++:s libstdc++ 工具链,你可能会得到你想要的错误:

    clang++ -stdlib=libstdc++ -std=c++98 -o main main.cpp
    

    【讨论】:

    • 我认为 MacOS 不再包含 -stdlib=libstdc++ (我已将错误添加到帖子中)。有没有办法手动安装?
    • @Charn 我确定有,但我没有使用 MacOS 的经验。也许它可以在自制软件或 MacOS 的包装管理器中使用。最坏的情况,你可以下载 gcc 并编译它。
    【解决方案3】:

    我找到了一个简单的解决方案:使用 homebrew 安装 gcc 并使用 g++-11 编译。

    【讨论】:

    • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
    • 我似乎你可以接受我的回答,因为我建议使用g++s 工具链(当你在 cmets 中询问时我建议使用自制软件安装它)。
    猜你喜欢
    • 2021-01-28
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多