您现在的位置是:首页 > 编程 > 

mac 使用Clang(ext

2025-07-22 20:04:39
mac 使用Clang(ext 为了整理思路,文章采用模拟2人对话方式。本文主要内容libc++ 是LLVM编译器套件的默认C++标准库。libstdc++是GU编译器套件(GCC)的默认C++标准库clang 环境变量设置代码语言:shell复制export PATH="/usr/local/opt/llvm/bin:$PATH" export LDFLAGS="

mac 使用Clang(ext

为了整理思路,文章采用模拟2人对话方式。

本文主要内容

  1. libc++ 是LLVM编译器套件的默认C++标准库。
  2. libstdc++是GU编译器套件(GCC)的默认C++标准库
  3. clang 环境变量设置
代码语言:shell复制
export PATH="/usr/local/opt/llvm/bin:$PATH"
export LDFLAGS="-L/usr/local/opt/llvm/lib/c++ -L/usr/local/opt/llvm/lib/unwind -lunwind" 
export CPPFLAGS="-I/usr/local/opt/llvm/include“

掌握最少知识

操作系统

开发语言

编译器

连接器

c++标准库

集成工具

Linux

c/c++

GCC

GU Linker (ld)

libstdc++

gcc/g++

macOS

c/c++

Clang

LLVM Linker (lld)

libc++

Windows

c++

MSVC

Microsoft Visual C++/MinGW

跨平台

Go

gc

跨平台

rust

rustc

提问:gcc是编译c语言代码,g++编译cpp代码,有什么区别 或者说c与cpp有什么区别?

  • 差别 就是标准库,例如 stl 用到数据结构和算法

gcc -lstdc++

如果想使用 gcc 指令来编译执行 C++ 程序,需要在使用 gcc 指令时,手动为其添加

 -lstdc++ 选项,表示 gcc 在编译 C++ 程序时可以链接必要的 C++ 标准库

该程序中使用了标准库 <iostream> 和 <string> 提供的类对象,而 gcc 默认是无法到它们的

提问:标准库:libc ,libc++, libstdc++区别?

  1. 编译器支持: libstdc++是GU编译器套件(GCC)的默认C++标准库实现, 而libc++是LLVM编译器套件的默认C++标准库实现。 因此,libstdc++主要用于GCC编译器,而libc++主要用于LLVM编译器(如Clang)。
  2. gcc:/usr/lib/gcc/x86_64-linux-gnu/11/libstdc++.so
代码语言:shell复制
ldd  
  libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f62cd56f000) c++
   libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f62cd46000) 
  1. 标准遵循:libstdc++实现了C++98、C++0、C++11、C++14和C++17标准的大部分功能,而libc++更加注重C++11、C++14和C++17标准的支持,并且在C++20标准中有更好的兼容性。 libc++ is a new implementation of the C++ standard library, targeting C++11 and abov
任务01: 从hello word

mac 使用Clang配置VS Code C/C++环境

mac 版本:

代码语言:shell复制
sw_vers

Productame: macOS

ProductVersion: 15.2

BuildVersion: 24C101

问题:
Warning: You are using macOS 12.  
We (and Apple) do not provide support for this old version.
但在今年9月份的一次更新中,Brew 放弃了对 Monterey 的支持
解决:
升级os版本 耗时一个晚上

installing LLVM on MacOS

代码语言:shell复制
xcode-select --install //大约15分钟
xcode-select -p

/Applicati/Xcode.app/Contents/Developer

brew update
xcode-select --install //大约15分钟
brew install llvm //

查看帮助文档:brew info llvm

代码语言:shell复制
==> llvm: stable 19.1.6 (bottled), HEAD [keg-only]

ext-gen compiler infrastructure

/

Installed

/usr/local/Cellar/llvm/19.1.6 (8,107 files, 2GB)

Poured from bottle using the formulae.brew.sh API on 2025-01-12 at 08:26:07

From: .rb

License: Apache-2.0 WITH LLVM-exception

==> Dependencies

Build: cmake, ninja, swig

Required: python@.1, xz, z, zstd

==> Opti

--HEAD

Install HEAD version

==> Caveats

CLAG_COFIG_FILE_SYSTEM_DIR: /usr/local/etc/clang

CLAG_COFIG_FILE_USER_DIR: ~/.config/clang

  

LLD is now provided in a separate formula:

brew install lld


We plan to build LLVM 20 with `LLVM_EABLE_EH=OFF`. Please see:




Using `clang`, `clang++`, etc., requires a CLT installation at `/Library/Developer/CommandLineTools`.

If you don't want to install the CLT, you can write appropriate configuration files pointing to your

SDK at ~/.config/clang.

  

To use the bundled libunwind please use the following LDFLAGS:

LDFLAGS="-L/usr/local/opt/llvm/lib/unwind -lunwind"

  

To use the bundled libc++ please use the following LDFLAGS:

LDFLAGS="-L/usr/local/opt/llvm/lib/c++ -L/usr/local/opt/llvm/lib/unwind -lunwind"

  

OTE: You probably want to use the libunwind and libc++ provided by macOS unless you know what you're doing.

  

llvm is keg-only, which means it was not symlinked into /usr/local,

because macOS already provides this software and installing another version in

parallel can cause all kinds of trouble.

  

If you need to have llvm first in your PATH, run:

echo 'export PATH="/usr/local/opt/llvm/bin:$PATH"' >> ~/.zshrc

  

For compilers to find llvm you may need to set:

export LDFLAGS="-L/usr/local/opt/llvm/lib"

export CPPFLAGS="-I/usr/local/opt/llvm/include"

编译环境配置:

代码语言:shell复制
echo 'export PATH="/usr/local/opt/llvm/bin:$PATH"' >> ~/.bashrc

//这将使你的终端会话能够到 LLVM 的 `clang` 和 `clang++` 命令。


clang -v

Homebrew clang version 19.1.6

Target: x86\_64-apple-darwin24.2.0

Thread model: posix

InstalledDir: /usr/local/Cellar/llvm/19.1.6/bin

Configuration file: /usr/local/etc/clang/x86\_

System configuration file directory: /usr/local/etc/clang

设置编译器标志

代码语言:shell复制
To use the bundled libc++ please use the following LDFLAGS:

echo 'export LDFLAGS="-L/usr/local/opt/llvm/lib - L/usr/local/opt/llvm/lib/c++ -L/usr/local/opt/llvm/lib/unwind -lunwind"' >> ~/.bashrc

echo 'export CPPFLAGS="-I/usr/local/opt/llvm/include"' >> ~/.bashrc

source ~/.bashrc

How to use LDFLAGS in makefile

Makefile选项CPPFLAGS :

  • 指定头文件(.件)的路径
  • CPPFLAGS 可以 用于 C 和 C++ 两者。
  • gcc参数 -I/usr/include ,大写的I

Makefile选项LDFLAGS

  • 指定库文件的位置
  • gcc参数LDFLAGS=-L/usr/lib 大写L
  • LIBS:告诉链接器要链接哪些库文件,如LIBS = -lpthread -liconv 小写l
gcc 编译 hello world代码过程
gcc的编译过程

说明:

GCC程序的编译过程大概分四个阶段

  • 预处理(Pre-Processing) g++ -E -o hello.i 说明: 1. g++ 默认使用 libstdc++标准库 2. 模板的处理不是在预处理阶段完成的
  • 编译(Compiling):
    1. g++ -S hello.i -o hello.s
    2. 说明:编译过程就是把预处理完的文件进行一系列词法分析,语法分析,语义分析及优化后生成相应的汇编代码文件
  • 汇编(Assembling) 1.g++ -c hello.s -o 1. objdump -h 以获取二进制文件每个段的头部信息
  • 链接(Linking)
  • 链接器ld将各个目标文件组装在一起,解决符号依赖,库依赖关系,并生成可执行文件
  • g++ -o hello
  • 连接过程 g++ -v -o hello
代码语言:shell复制
Using built-in specs.

COLLECT\_GCC=g++

COLLECT\_LTO\_WRAPPER=/usr/lib/gcc/x86\_64-linux-gnu/11/lto-wrapper

OFFLOAD\_TARGET\_AMES=nvptx-none:amdgcn-amdhsa

OFFLOAD\_TARGET\_DEFAULT=1

Target: x86\_64-linux-gnx

Thread model: posix

默认情况下是使用动态链接

file hello

hello: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked

clang 编译hellow word 过程代码语言:shell复制
clang++  -o hello -L/usr/local/opt/llvm/lib/c++ -L/usr/local/opt/llvm/lib/unwind -lc++ -lunwind

export LDFLAGS="-L/usr/local/opt/llvm/lib/c++ -L/usr/local/opt/llvm/lib/unwind -lunwind"

clang++  -o hello

otool -L hello

/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1800.105.0)

/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 151.0.0)
  • lang++:使用 LLVM 的 C++ 编译器来编译 C++ 源代码。
  • :你的 C++ 源文件。
  • -o hello:指定输出文件名为 hello,即编译后生成的可执行文件名。
  • -L/usr/local/opt/llvm/lib/c++:告诉编译器去 /usr/local/opt/llvm/lib/c++ 目录查 libc++ 库,这是通过 Homebrew 安装的 LLVM 提供的库。
  • -L/usr/local/opt/llvm/lib/unwind:告诉编译器去 /usr/local/opt/llvm/lib/unwind 目录查 libunwind 库,这是 LLVM 提供的用于处理堆栈展开和异常的库。
  • -lc++:指定使用 LLVM 提供的 libc++ 库。
  • -lunwind:指定链接 LLVM 提供的 libunwind

这样做的效果:

  • 通过这个命令,clang++ 将使用 Homebrew 安装的 LLVM 提供的 libc++libunwind,而不是系统自带的版本。
  • 这对于需要使用更现代的 LLVM 特性或者自定义版本的库时非常有用

小王提问:

/usr/lib/libc++.1.dylib 是 macOS 系统自带的 C++ 标准库,

不是通过 LLVM 安装的。这个编译不对

  • 老王回答:~/.bash_profile环境变量重新设置一次
代码语言:shell复制
export LDFLAGS="-L/usr/local/opt/llvm/lib/c++ -L/usr/local/opt/llvm/lib/unwind -lunwind" export CPPFLAGS="-I/usr/local/opt/llvm/include

clang++  -o hello

otool -L hello

hello:

/usr/local/opt/llvm/lib/c++/libc++.1.dylib (compatibility version 1.0.0, current version 1.0.0)

/usr/local/opt/llvm/lib/unwind/libunwind.1.dylib (compatibility version 1.0.0, current version 1.0.0)

完整过程:clang++ -v  -o hello

clang++ -v -E  -o hello.i

clang++ -v -c  hello.s -o

clang++  -v  -o hello

从你提供的 clang++ -v -o hello 命令的输出中,我们可以看到 clang++ 编译过程的详细信息,涉及几个关键步骤:

  1. 编译器信息
  2. clang version 19.1.6:表示你正在使用 Homebrew 安装的 clang++ 版本 19.1.6。
  3. 目标平台x86_64-apple-darwin24.2.0,表明编译器为 macOS 的 x86_64 架构生成代码。
  4. 安装目录:编译器位于 /usr/local/Cellar/llvm/19.1.6/bin。预处理:
  5. 编译器会处理源代码文件 ,展开其中的宏和头文件。编译器在日志中显示了头文件搜索路径。例如,它会查 #include 文件,在 /usr/local/Cellar/llvm/19.1.6/bin/../include/c++/v1/usr/local/Cellar/llvm/19.1.6/lib/clang/19/include 等目录中查标准库。编译:
  6. 在此阶段,clang++ 将 C++ 源代码文件 编译为目标文件(.o 文件)。它调用了 clang-19clang++ 的前端),并且使用了很多编译选项,如 -target-sdk-version=15.2 来指定 SDK 版本。
  7. 日志中提到了编译器的一些标志,如 -fcxx-excepti(启用 C++ 异常支持),-fexcepti(启用异常),-mrelocation-model pic(生成位置无关代码),等等。链接:
  8. 最后,编译器调用 ld(链接器)来链接生成目标文件(.o)和所需的标准库(如 libc++)。这会生成最终的可执行文件 hello
  9. 链接器调用日志显示了它如何将目标文件与标准库链接(包括 libc++libSystem),并使用 -syslibroot 指定了 macOS 的系统库路径。

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1184347.html

相关标签:无
上传时间: 2025-07-22 08:31:48
留言与评论(共有 15 条评论)
本站网友 长沙湘江世纪城房价
29分钟前 发表
libc++ is a new implementation of the C++ standard library
本站网友 国画牡丹花
16分钟前 发表
库依赖关系
本站网友 玉米须的功效与作用
13分钟前 发表
而libc++是LLVM编译器套件的默认C++标准库实现
本站网友 谁有那样的网址
29分钟前 发表
26
本站网友 qq视频录像
12分钟前 发表
cmake
本站网友 上海万科朗润园
8分钟前 发表
而libc++主要用于LLVM编译器(如Clang)
本站网友 装修价格表
22分钟前 发表
即编译后生成的可执行文件名
本站网友 气虚怎么办
4分钟前 发表
/usr/local/opt/llvm/lib/c++/libc++.1.dylib (compatibility version 1.0.0
本站网友 asp论坛
6分钟前 发表
current version 1800.105.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0
本站网友 本田汽车召回
28分钟前 发表
库依赖关系
本站网友 湘潭团购网
7分钟前 发表
/usr/local/etc/clang CLAG_COFIG_FILE_USER_DIR
本站网友 睡觉朝向风水
14分钟前 发表
posix InstalledDir
本站网友 醋泡大蒜
2分钟前 发表
posix InstalledDir
本站网友 普洱茶的功效与禁忌
3分钟前 发表
2GB) Poured from bottle using the formulae.brew.sh API on 2025-01-12 at 08