macOS使用LLVM官方发布的tar.xz来安装Clang编译器

之前笔者写过一篇博文ubuntu使用LLVM官方发布的tar.xz来安装Clang编译器介绍了Ubuntu下使用官方发布的tar.xz包来安装Clang编译。官方发布的版本中也有MacOS版本的tar.xz,那MacOS应该也是可以安装的。

笔者2015款MBP笔记本,CPU是intel的,出厂系统是MacOS10.12(Sierra),后面自己升级安装到10.13(由于只有128G硬盘,不能安装太新的系统):

在这里插入图片描述

目前的Clang编译器是9.0__cplusplus版本是201406,支持C++14,部分支持C++17,如果想使用新一点的C++标准,就需要更新编译器。

一、安装Clang编译器

LLVM官方在LLVM 15及之前是有出Intel版本的tar.xz安装包的,后面有的版本没macOS版本的,有的版本有macOS的,但是是ARM CPU的,后面19.0开始有macOS版本的了,而且ARM与Intel的都有。

在这里插入图片描述

只可惜笔者的MBP系统太老,不能安装最新版本的,只能退而求其次,安装LLVM 15.0.7,而且有Intel CPU的x86_64版本:

在这里插入图片描述
先下载clang+llvm-15.0.7-x86_64-apple-darwin21.0.tar.xz
,再使用下面的命令解压:

tar -xf clang+llvm-15.0.7-x86_64-apple-darwin21.0.tar.xz

解压后,可以将目录改名为llvm-15,然后移动到/usr/local/目录下,为了确保独立性,不弄脏/usr/local/目录,直接将整个llvm-15目录移动,而不是移动llvm-15下的子目录。

在这里插入图片描述

然后在~/.bash_profile中设置PATH,将/usr/local/llvm-15/bin添加到PATH变量中:

export PATH=/usr/local/llvm-15/bin:$PATH

二、测试、使用

1.简单测试

添加好后,新开一个终端进行简单测试,测试clang没问题:

$ clang -v
clang version 15.0.7
Target: x86_64-apple-darwin17.7.0
Thread model: posix
InstalledDir: /usr/local/llvm-15/bin

但是测试lldb就报错了:

$ lldb
dyld: Library not loaded: @rpath/liblldb.15.0.7.dylibReferenced from: /usr/local/llvm-15/bin/lldbReason: no suitable image found.  Did find:/usr/local/llvm-15/bin/../lib/liblldb.15.0.7.dylib: cannot load 'liblldb.15.0.7.dylib' (load command 0x80000034 is unknown)/usr/local/llvm-15/bin/../lib/liblldb.15.0.7.dylib: stat() failed with errno=1
Abort trap: 6

使用otool -l /usr/local/llvm-15/lib/liblldb.15.0.7.dylib指令查看:

$ otool -l /usr/local/llvm-15/lib/liblldb.15.0.7.dylib 
/usr/local/llvm-15/lib/liblldb.15.0.7.dylib:
Mach headermagic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags0xfeedfacf 16777223          3  0x00           6    31       3400 0x00910085
Load command 0cmd LC_SEGMENT_64cmdsize 872segname __TEXTvmaddr 0x0000000000000000vmsize 0x00000000067c8000fileoff 0filesize 108822528maxprot 0x00000005initprot 0x00000005nsects 10flags 0x0
Sectionsectname __text……Load command 4cmd LC_ID_DYLIBcmdsize 56name @rpath/liblldb.15.0.7.dylib (offset 24)time stamp 1 Thu Jan  1 08:00:01 1970current version 15.0.7
compatibility version 0.0.0
Load command 5cmd ?(0x80000034)cmdsize 16
Load command 6cmd ?(0x80000033)cmdsize 16
Load command 7cmd LC_SYMTABcmdsize 24symoff 119381816nsyms 180001stroff 122268616strsize 16367424
Load command 8cmd LC_DYSYMTAB

发现还真是有未知命令:cmd ?(0x80000034)cmd ?(0x80000033),暂时无法解决,就还是使用系统自带的lldb吧。

2. 使用VSCode测试

只要设置好Clang的路径在PATH变量中,打开VSCode,重新扫描工具包,即可搜索到新的Clang版本。

在这里插入图片描述

切换到Clang 15,VSCode会自动重新执行CMake命令:

在这里插入图片描述

[cmake]     FAILED: cmTC_d20cb 
[cmake]     : && /usr/local/llvm-15/bin/clang  -Wl,-search_paths_first -Wl,-headerpad_max_install_names  CMakeFiles/cmTC_d20cb.dir/testCCompiler.c.o -o cmTC_d20cb   && :
[cmake]     ld: unknown option: -platform_version
[cmake]     clang-15: error: linker command failed with exit code 1 (use -v to see invocation)
[cmake]     ninja: build stopped: subcommand failed.

无法正确执行CMake,CMake在编译简单的测试程序时,无法通过。

ld: unknown option: -platform_version提示是ld找到不到参数,原因是新版本的Clang编译器与系统的链接器ld不匹配,需要使用Clang自己的链接器lld,由于是CMake在测试编译器时报的错,那就需要在它之前设置使用lld

CMake中要设置链接器使用lld,有两种方法:

  1. 可以在cmake命令行参数中设置如下变量:
  • CMAKE_EXE_LINKER_FLAGS:设置可执行文件链接器的变量,用法:-DCMAKE_EXE_LINKER_FLAGS=-fuse-ld=lld,注意大小写
  • CMAKE_SHARED_LINKER_FLAGS:设置动态链接库链接器的变量,用法:-DCMAKE_SHARED_LINKER_FLAGS=-fuse-ld=lld
  • CMAKE_LINK_LIBRARY_FLAG:设置静态链接库链接器的旗标,用法:-DCMAKE_LINK_LIBRARY_FLAG=-fuse-ld=lld
  • CMAKE_LINKER_TYPE:在3.29版本添加的新变量,用法:-DCMAKE_LINKER_TYPE=LLD,注意LLD是大写

在VSCode中需要在settings.json配置文件中设置:

"cmake.configureArgs": ["-DCMAKE_EXE_LINKER_FLAGS=-fuse-ld=lld","-DCMAKE_SHARED_LINKER_FLAGS=-fuse-ld=lld","-DCMAKE_LINK_LIBRARY_FLAG=-fuse-ld=lld","-DCMAKE_LINKER_TYPE=LLD" // CMake3.29+才能使用
],
  1. CMakeLists.txt中设置
    如果是在CMakeLists.txt中设置,一定要在最顶层的CMakeLists.txtproject命令之前设置:
cmake_minimum_required(VERSION 3.25)
set(CMAKE_EXE_LINKER_FLAGS -fuse-ld=lld)
set(CMAKE_SHARED_LINKER_FLAGS -fuse-ld=lld)
set(CMAKE_LINK_LIBRARY_FLAG -fuse-ld=lld)
set(CMAKE_LINKER_TYPE LLD)
project(demo)

在这里插入图片描述

编译链接都没问题了。

3. 使用QtCreator测试

笔者在MBP上安装的是QtCreator 5.03版本,基于Qt5.15.2的:

在这里插入图片描述

但Qt的SDK是5.14.2:

在这里插入图片描述

可以先使用QtCreator的自动检测,看是否能检测到Clang15,如果不能,手动添加:

在这里插入图片描述

在Kits中克隆一个原来的配置,将下面的C/C++编译器设置为clang 15:

在这里插入图片描述

并在CMake Configuration中添加如下配置:

CMAKE_EXE_LINKER_FLAGS:STRING=-fuse-ld=lld
CMAKE_LINK_LIBRARY_FLAG:STRING=-fuse-ld=lld
CMAKE_SHARED_LINKER_FLAGS:STRING=-fuse-ld=lld

如下图所示:

在这里插入图片描述

在Qt项目中使用新的Kits编译即可。

但是笔者在设置好后,QtCreator会有一个警告:

在这里插入图片描述

cstdlib源码:

#if !defined(_LIBCPP_CXX03_LANG)
using ::at_quick_exit _LIBCPP_USING_IF_EXISTS;
using ::quick_exit _LIBCPP_USING_IF_EXISTS;
#endif
#if _LIBCPP_STD_VER > 14
using ::aligned_alloc _LIBCPP_USING_IF_EXISTS;
#endif

原因是at_quick_exitquick_exit函数在C11中添加,而std::at_quick_exitstd::quick_exit函数在C++11中添加,参见:
https://cppreference.cn/w/c/program/at_quick_exit
https://cppreference.cn/w/cpp/utility/program/at_quick_exit

aligned_alloc是在C11中添加,而std::aligned_alloc是在C++17中添加,参见:
https://cppreference.cn/w/c/memory/aligned_alloc
https://cppreference.cn/w/cpp/memory/c/aligned_alloc

笔者MacOS系统原来的C库缺少这几个函数的,可以在一个头文件中声明一下,不让QtCreator报警告:

lost.h

#ifndef LOST_H
#define LOST_H#include <_ctype.h>int at_quick_exit(void (*)());
int quick_exit(void (*)());
void *aligned_alloc(size_t alignment, size_t size);
int timespec_get(struct timespec* const time_spec,int const base
);#endif // LOST_H

然后在#include <cstdlib>之前先#include "lost.h"即可。

在这里插入图片描述
不报警告了,但是在代码中不能使用这几个函数,因为系统中没有相应的实现

如果对你有帮助,欢迎点赞收藏!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/66754.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中企出海:从国际投资建厂:投前投中投后重点事项

1. 投前重点事项 1.1 市场调研与分析 在国际投资建厂的投前阶段&#xff0c;市场调研与分析是至关重要的基础工作&#xff0c;它能够帮助企业全面了解目标市场&#xff0c;为后续决策提供有力依据。 市场规模与潜力&#xff1a;通过收集和分析目标国家或地区的经济数据、行业…

Git实用指南:忽略文件、命令别名、版本控制、撤销修改与标签管理

目录 1.忽略特殊文件 1.1.那如何配置我们需要忽略的文件的呢&#xff1f; 1.2.如何检验效果&#xff1f; 2.给命令配置别名 3.基本操作之版本回退 3.1.使用场景&#xff1a; 3.2.使用方法&#xff1a; 4.撤销修改 情况一&#xff1a;对于工作区的代码&#xff0c;还没…

Glary Utilities Pro 多语便携版系统优化工具 v6.21.0.25

Glary Utilities是一款功能强大的系统优化工具软件&#xff0c;旨在帮助用户清理计算机垃圾文件、修复系统错误、优化系统性能等。 软件功能 清理和修复&#xff1a;可以清理系统垃圾文件、无效注册表项、无效快捷方式等&#xff0c;修复系统错误和蓝屏问题。 优化和加速&…

Oracle 创建并使用外部表

目录 一. 什么是外部表二. 创建外部表所在的文件夹对象三. 授予访问外部表文件夹的权限3.1 DBA用户授予普通用户访问外部表文件夹的权限3.2 授予Win10上的Oracle用户访问桌面文件夹的权限 四. 普通用户创建外部表五. 查询六. 删除 一. 什么是外部表 在 Oracle 数据库中&#x…

基于FPGA的BPSK+costas环实现,包含testbench,分析不同信噪比对costas环性能影响

目录 1.算法仿真效果 2.算法涉及理论知识概要 3.Verilog核心程序 4.完整算法代码文件获得 1.算法仿真效果 本作品是之前作品的改进和扩展&#xff1a; 1.m基于FPGA的BPSK调制解调通信系统verilog实现,包含testbench,包含载波同步_csdn基于fpga的bpsk-CSDN博客 2.m基于FP…

后端开发Web

Maven Maven是apache旗下的一个开源项目&#xff0c;是一款用于管理和构建java项目的工具 Maven的作用 依赖管理 方便快捷的管理项目依赖的资源&#xff08;jar包&#xff09;&#xff0c;避免版本冲突问题 统一项目结构 提供标准、统一的项目结构 项目构建 标准跨平台(…

前沿技术趋势洞察:2024年技术的崭新篇章与未来走向!

引言 时光飞逝&#xff0c;2024年已经来临&#xff0c;回顾过去一年&#xff0c;科技的迅猛进步简直让人目不暇接。 在人工智能&#xff08;AI&#xff09;越来越强大的今天&#xff0c;我们不再停留在幻想阶段&#xff0c;量子计算的雏形开始展示它的无穷潜力&#xff0c;Web …

【10.2】队列-设计循环队列

一、题目 设计你的循环队列实现。 循环队列是一种线性数据结构&#xff0c;其操作表现基于 FIFO&#xff08;先进先出&#xff09;原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普…

博客之星2024年度总评选——我的年度创作回顾与总结

2024年&#xff0c;是我在CSDN博客上持续耕耘、不断成长的一年。在此&#xff0c;与大家分享一下我的年度创作回顾与总结。 一、创作成长与突破 在人工智能领域&#xff0c;技术迭代迅速&#xff0c;知识更新频繁。为了保持自己的竞争力&#xff0c;在今年&#xff0c;我始终…

IDEA运行Java项目总会报程序包xxx不存在

我的在另外一台电脑上跑是没有问题的&#xff0c;在新的电脑上跑的时候&#xff0c;又出现了这个恶心的问题...... 思来想去&#xff0c;唯一的问题就是我的mavn环境没的配置好 如何在本地部署mavn环境&#xff0c;这里推荐一篇很好的文章&#xff1a; Maven安装与配置&…

java 根据前端传回的png图片数组,后端加水印加密码生成pdf,返回给前端

前端传回的png图片数组&#xff0c;后端加水印加密码生成pdf&#xff0c;返回给前端 场景&#xff1a;重点&#xff1a;maven依赖controllerservice 场景&#xff1a; 当前需求&#xff0c;前端通过html2canvas将页面报表生成图片下载&#xff0c;可以仍然不满意。 需要java后…

数据分库分表和迁移方案

在我们业务快速发展的过程中&#xff0c;数据量必然也会迎来突飞猛涨。那么当我们的数据量百倍、千倍、万倍、亿倍增长后&#xff0c;原有的单表性能就不能满足我们日常的查询和写入了&#xff0c;此时数据架构就不得不进行拆分&#xff0c;比如单表拆分成10张表、100张表、单个…

线上突发:MySQL 自增 ID 用完,怎么办?

线上突发&#xff1a;MySQL 自增 ID 用完&#xff0c;怎么办&#xff1f; 1. 问题背景2. 场景复现3. 自增id用完怎么办&#xff1f;4. 总结 1. 问题背景 最近&#xff0c;我们在数据库巡检的时候发现了一个问题&#xff1a;线上的地址表自增主键用的是int类型。随着业务越做越…

Java导出通过Word模板导出docx文件并通过QQ邮箱发送

一、创建Word模板 {{company}}{{Date}}服务器运行情况报告一、服务器&#xff1a;总告警次数&#xff1a;{{ServerTotal}} 服务器IP:{{IPA}}&#xff0c;总共告警次数:{{ServerATotal}} 服务器IP:{{IPB}}&#xff0c;总共告警次数:{{ServerBTotal}} 服务器IP:{{IPC}}&#x…

【22】Word:小李-高新技术企业政策❗

目录 题目​ NO1.2 NO3 NO4 NO5.6 NO7.8 NO9.10 若文章中存在删除空白行等要求&#xff0c;可以到最后来完成。注意最后一定要检查此部分&#xff01;注意&#xff1a;大多是和事例一样即可&#xff0c;不用一摸一样&#xff0c;但也不要差太多。 题目 NO1.2 F12Fn&a…

自动化部署(三):项目管理平台

一、项目管理平台作用 帮助团队高效规划、执行和监控项目进度&#xff0c;确保任务按时完成并实现目标 敏捷开发&#xff1a;提供标准敏捷研发管理&#xff0c;支持Scrum 与 Kanban 规模化敏捷&#xff1a;支持大型研发团队跨项目协同&#xff0c;实现多项目路线图规划和资源管…

常用集合-数据结构-MySql

目录 java核心&#xff1a; 常用集合与数据结构: 单例集合: 双列集合: 线程安全的集合: ConcurrentHashMap集合: HashTable集合: CopyOnWriteArrayList集合: CopyOnWriteArraySet集合: ConcurrentLinkedQueue队列: ConcurrentSkipListMap和ConcurrentSkipListSet&…

IP属地与视频定位位置不一致:现象解析与影响探讨

在数字化时代&#xff0c;IP属地和视频定位位置已成为我们获取网络信息、判断内容真实性的重要依据。然而&#xff0c;有时我们会发现&#xff0c;某些视频内容中展示的定位位置与其发布者的IP属地并不一致。这种不一致现象引发了广泛的关注和讨论。本文旨在深入剖析IP属地与视…

计算机毕业设计hadoop+spark股票基金推荐系统 股票基金预测系统 股票基金可视化系统 股票基金数据分析 股票基金大数据 股票基金爬虫

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

机器学习-数据集划分

文章目录 一. 为什么要划分数据集二. 数据集划分的方法1. 留出法&#xff1a;2. 交叉验证&#xff1a;将数据集划分为训练集&#xff0c;验证集&#xff0c;测试集3. 留一法&#xff1a;4. 自助法&#xff1a; 一. 为什么要划分数据集 为了能够评估模型的泛化能力&#xff0c;可…