mac 使用Clang(ext
mac 使用Clang(ext
为了整理思路,文章采用模拟2人对话方式。
本文主要内容
- libc++ 是LLVM编译器套件的默认C++标准库。
- libstdc++是GU编译器套件(GCC)的默认C++标准库
- clang 环境变量设置
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++区别?
- 编译器支持: libstdc++是GU编译器套件(GCC)的默认C++标准库实现, 而libc++是LLVM编译器套件的默认C++标准库实现。 因此,libstdc++主要用于GCC编译器,而libc++主要用于LLVM编译器(如Clang)。
- gcc:/usr/lib/gcc/x86_64-linux-gnu/11/libstdc++.so
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)
- 标准遵循: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
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程序的编译过程大概分四个阶段
- 预处理(Pre-Processing) g++ -E -o hello.i 说明: 1. g++ 默认使用 libstdc++标准库 2. 模板的处理不是在预处理阶段完成的
- 编译(Compiling):
- g++ -S hello.i -o hello.s
- 说明:编译过程就是把预处理完的文件进行一系列词法分析,语法分析,语义分析及优化后生成相应的汇编代码文件
- 汇编(Assembling) 1.g++ -c hello.s -o 1. objdump -h 以获取二进制文件每个段的头部信息
- 链接(Linking)
- 链接器ld将各个目标文件组装在一起,解决符号依赖,库依赖关系,并生成可执行文件
- g++ -o hello
- 连接过程 g++ -v -o hello
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++ -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环境变量重新设置一次
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++
编译过程的详细信息,涉及几个关键步骤:
- 编译器信息:
clang version 19.1.6
:表示你正在使用 Homebrew 安装的clang++
版本 19.1.6。- 目标平台:
x86_64-apple-darwin24.2.0
,表明编译器为 macOS 的 x86_64 架构生成代码。 - 安装目录:编译器位于
/usr/local/Cellar/llvm/19.1.6/bin
。预处理: - 编译器会处理源代码文件
,展开其中的宏和头文件。编译器在日志中显示了头文件搜索路径。例如,它会查
#include
文件,在/usr/local/Cellar/llvm/19.1.6/bin/../include/c++/v1
和/usr/local/Cellar/llvm/19.1.6/lib/clang/19/include
等目录中查标准库。编译: - 在此阶段,
clang++
将 C++ 源代码文件编译为目标文件(
.o
文件)。它调用了clang-19
(clang++
的前端),并且使用了很多编译选项,如-target-sdk-version=15.2
来指定 SDK 版本。 - 日志中提到了编译器的一些标志,如
-fcxx-excepti
(启用 C++ 异常支持),-fexcepti
(启用异常),-mrelocation-model pic
(生成位置无关代码),等等。链接: - 最后,编译器调用
ld
(链接器)来链接生成目标文件(.o
)和所需的标准库(如libc++
)。这会生成最终的可执行文件hello
。 - 链接器调用日志显示了它如何将目标文件与标准库链接(包括
libc++
和libSystem
),并使用-syslibroot
指定了 macOS 的系统库路径。
#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
上一篇:大改Yolo框架
下一篇:终于遇到了一款好用的OCR产品
推荐阅读
留言与评论(共有 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 |