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.rhkb.cn/news/7885.html

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

相关文章

机器学习周报-文献阅读

文章目录 摘要Abstract 1 相关知识1.1 WDN建模1.2 掩码操作&#xff08;Masking Operation&#xff09; 2 论文内容2.1 WDN信息的数据处理2.2 使用所收集的数据构造模型2.2.1 Gated graph neural network2.2.2 Masking operation2.2.3 Training loss2.2.4 Evaluation metrics 2…

Doris Schema Change 常见问题分析

1. 什么是 Schema Change Schema Change 是在数据库中修改表结构的一种操作&#xff0c;例如添加列、删除列、更改列类型等。 ⚠️Schema Change 限制⚠️ 一张表在同一时间只能有一个 Schema Change 作业在运行。分区列和分桶列不能修改。如果聚合表中有 REPLACE 方式聚合的…

我的2024年年度总结

序言 在前不久&#xff08;应该是上周&#xff09;的博客之星入围赛中铩羽而归了。虽然心中颇为不甘&#xff0c;觉得这一年兢兢业业&#xff0c;每天都在发文章&#xff0c;不应该是这样的结果&#xff08;连前300名都进不了&#xff09;。但人不能总抱怨&#xff0c;总要向前…

C++ DLL注入原理以及示例

0、 前言 0.1 什么是DLL注入 DLL&#xff08;动态链接库&#xff09;注入是一种技术&#xff0c;通过将外部的 DLL 文件强行加载到目标进程的地址空间中&#xff0c;使得外部代码可以执行。这种技术常用于修改或扩展应用程序的行为&#xff0c;甚至用于恶意攻击。 0.2 DLL注入…

MATLAB绘图:随机彩色圆点图

这段代码在MATLAB中生成并绘制了500个随机位置和颜色的散点图。通过随机生成的x和y坐标以及颜色&#xff0c;用户可以直观地观察到随机点的分布。这种可视化方式在数据分析、统计学和随机过程的演示中具有广泛的应用。 文章目录 运行结果代码代码讲解 运行结果 代码 clc; clea…

关于使用PHP时WordPress排错——“这意味着您在wp-config.php文件中指定的用户名和密码信息不正确”的解决办法

本来是看到一位好友的自己建站&#xff0c;所以突发奇想&#xff0c;在本地装个WordPress玩玩吧&#xff0c;就尝试着装了一下&#xff0c;因为之前电脑上就有MySQL&#xff0c;所以在自己使用PHP建立MySQL时报错了。 最开始是我的php启动mysql时有问题&#xff0c;也就是启动过…

RabbitMQ 架构分析

文章目录 前言一、RabbitMQ架构分析1、Broker2、Vhost3、Producer4、Messages5、Connections6、Channel7、Exchange7、Queue8、Consumer 二、消息路由机制1、Direct Exchange2、Topic Exchange3、Fanout Exchange4、Headers Exchange5、notice5.1、备用交换机&#xff08;Alter…

【Uniapp-Vue3】setTabBar设置TabBar和下拉刷新API

一、setTabBar设置 uni.setTabBarItem({ index:"需要修改第几个", text:"修改后的文字内容" }) 二、tabBar的隐藏和显式 // 隐藏tabBar uni.hideTabBar(); // 显示tabBar uni.showTabBar(); 三、为tabBar右上角添加文本 uni.setTabBarBadge({ index:"…

routeros7 adguardhome添加规则报错certificate expired

mikrokit routeros 7添加adguardhome容器。 /container/add remote-imageadguard/adguardhome:latest interfaceveth1 root-dircontainer/adgurdhome loggingyes结果发现添加不了规则&#xff0c;报证书过期。 Error: control/filtering/add_url | Couldn’t fetch filter fro…

壁纸设计过程中如何增加氛围感

在壁纸设计过程中&#xff0c;增加氛围感是提升整体视觉效果和情感传达的关键。以下是一些具体的方法和技巧&#xff0c;帮助你在设计中营造出强烈的氛围感&#xff1a; 一、色彩运用 选择主题色&#xff1a; 根据你想要传达的情感选择主色调。例如&#xff0c;温暖的色调&…

RabbitMQ模块新增消息转换器

文章目录 1.目录结构2.代码1.pom.xml 排除logging2.RabbitMQConfig.java3.RabbitMQAutoConfiguration.java 1.目录结构 2.代码 1.pom.xml 排除logging <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/PO…

2024年度总结:技术探索与个人成长的交织

文章目录 前言年度创作回顾&#xff1a;技术深耕与分享数据库技术&#xff1a;MySQL 与 MyBatisJava 及相关技术栈计算机网络&#xff1a;构建网络知识体系思维方式的转变&#xff1a;构建技术知识体系的桥梁 项目实践&#xff1a;人工智能与智慧医疗的碰撞生活与博客的融合与平…

python:taichi 模拟一维波场

在 Taichi 中模拟一维波场&#xff0c;通常是利用 Taichi 编程语言的特性来对一维空间中的波动现象进行数值模拟&#xff0c;以下是相关介绍&#xff1a; 原理基础 波动方程&#xff1a;一维波动方程的一般形式为 &#xff0c;其中 u(x,t) 表示在位置x 和时间t 处的波的状态&…

基于回归分析法的光伏发电系统最大功率计算simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于回归分析法的光伏发电系统最大功率计算simulink建模与仿真。选择回归法进行最大功率点的追踪&#xff0c;使用光强和温度作为影响因素&#xff0c;电压作为输出进行建模。…

深入MapReduce——引入

引入 前面我们已经深入了HDFS的设计与实现&#xff0c;对于分布式系统也有了不错的理解。 但HDFS仅仅解决了海量数据存储和读写的问题。要想让数据产生价值&#xff0c;一定是需要从数据中挖掘出价值才行&#xff0c;这就需要我们拥有海量数据的计算处理能力。 下面我们还是…

Vue 引入及简单示例

Vue 渐进式JavaScript 框架 学习笔记 - Vue 引入及简单示例 目录 与jquery区别 Vue引入 两种方式引入 下载到本地 代码结构 简单示例 Style中引入vue.js 对vue语法进行解析 对三目运算符支持 设置变量&#xff08;状态&#xff09; 总结 与jquery区别 不需要手动操…

系统思考—问题分析

很多中小企业都在面对转型的难题&#xff1a;市场变化快&#xff0c;资源有限&#xff0c;团队协作不畅……这些问题似乎总是困扰着我们。就像最近和一位企业主交流时&#xff0c;他提到&#xff1a;“我们团队每天都很忙&#xff0c;但效率始终没见提升&#xff0c;感觉像是在…

π0:仅有3B数据模型打通Franka等7种机器人形态适配,实现0样本的完全由模型自主控制方法

Chelsea Finn引领的Physical Intelligence公司&#xff0c;专注于打造先进的机器人大模型&#xff0c;近日迎来了一个令人振奋的里程碑。在短短不到一年的时间内&#xff0c;该公司成功推出了他们的首个演示版本。这一成就不仅展示了团队的卓越技术实力&#xff0c;也预示着机器…

第二十一周:Mask R-CNN

Mask R-CNN 摘要Abstract文章信息研究动机Mask RCNNRoIPool与RoIAlign 双线性插值Mask Branch(FCN)其他细节Mask RCNN损失Mask分支预测 网络搭建创新点与不足总结 摘要 本篇博客介绍了Mask R-CNN&#xff0c;这是一种用于实例分割的模型&#xff0c;能够在目标检测的基础上实现…

Windows本地部署(DeepSeek-R1-Distill-Qwen-1.5B)模型

文章目录 Windows本地部署&#xff08;DeepSeek-R1-Distill-Qwen-1.5B&#xff09;模型本机环境运行环境安装安装 WSL2&#xff0c;启用linux 系统进入linux 系统后&#xff0c;安装以下软件安装 Anaconda3安装 CUDA安装 pip创建虚拟环境并安装 vllm 模型下载模型运行部署模型测…