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

news2025/4/7 5:29:10

之前笔者写过一篇博文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.dylib
  Referenced from: /usr/local/llvm-15/bin/lldb
  Reason: 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 header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
 0xfeedfacf 16777223          3  0x00           6    31       3400 0x00910085
Load command 0
      cmd LC_SEGMENT_64
  cmdsize 872
  segname __TEXT
   vmaddr 0x0000000000000000
   vmsize 0x00000000067c8000
  fileoff 0
 filesize 108822528
  maxprot 0x00000005
 initprot 0x00000005
   nsects 10
    flags 0x0
Section
  sectname __text

……


Load command 4
          cmd LC_ID_DYLIB
      cmdsize 56
         name @rpath/liblldb.15.0.7.dylib (offset 24)
   time stamp 1 Thu Jan  1 08:00:01 1970
      current version 15.0.7
compatibility version 0.0.0
Load command 5
      cmd ?(0x80000034)
  cmdsize 16
Load command 6
      cmd ?(0x80000033)
  cmdsize 16
Load command 7
     cmd LC_SYMTAB
 cmdsize 24
  symoff 119381816
   nsyms 180001
  stroff 122268616
 strsize 16367424
Load command 8
            cmd 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.coloradmin.cn/o/2283849.html

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

相关文章

ppp综合实验

IP地址 r1 r2 r3 r4 hdlc封装 pap认证 r2 r3 chap认证 r2 r4 MGRE 主认证 [r1]int Tunnel 0/0/0 [r1-Tunnel0/0/0]ip add 192.168.4.1 24 [r1-Tunnel0/0/0]tunnel-protocol gre p2mp [r1-Tunnel0/0/0]source 12.1.1.1 [r1-Tunnel0/0/0]nhrp entry multicast dynamic [r1-Tu…

HBuilderX构建Vue项目

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl HBuilderX概述 HBuilderX是一款专为开发者设计的高效开发工具&#xff0c;致力于提升开发者的编码效率和体验。HBuilderX既适合追求极致效率的极客&#xff0c;也适合希望简…

基于微信小程序的英语学习交流平台设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

使用 Confluent Cloud 的 Elasticsearch Connector 部署 Elastic Agent

作者&#xff1a;来自 Elastic Nima Rezainia Confluent Cloud 用户现在可以使用更新后的 Elasticsearch Sink Connector 与 Elastic Agent 和 Elastic Integrations 来实现完全托管且高度可扩展的数据提取架构。 Elastic 和 Confluent 是关键的技术合作伙伴&#xff0c;我们很…

JDK17 HashMap

HashMap ArrayList用动态数组存放元素&#xff0c;而HashMap用动态数组&#xff08;桶&#xff09;存储键值对。 如果两个键值对映射到桶同一个索引&#xff0c;则称为散列冲突。HashMap采用拉链法解决冲突&#xff0c;即桶中每个索引指向一个链表或者红黑树&#xff0c;多个键…

ansible自动化运维实战--通过role远程部署nginx并配置(8)

文章目录 1、准备工作2、创建角色结构3、编写任务4、准备配置文件&#xff08;金甲模板&#xff09;5、编写变量6、编写处理程序7、编写剧本8、执行剧本Playbook9、验证-游览器访问每台主机的nginx页面 在 Ansible 中&#xff0c;使用角色&#xff08;Role&#xff09;来远程部…

Python网络自动化运维---用户交互模块

文章目录 目录 文章目录 前言 实验环境准备 一.input函数 代码分段解析 二.getpass模块 前言 在前面的SSH模块章节中&#xff0c;我们都是将提供SSH服务的设备的账户/密码直接写入到python代码中&#xff0c;这样很容易导致账户/密码泄露&#xff0c;而使用Python中的用户交…

计算机的错误计算(二百二十二)

摘要 利用大模型化简计算 实验表明&#xff0c;虽然结果正确&#xff0c;但是&#xff0c;大模型既绕了弯路&#xff0c;又有数值计算错误。 与前面相同&#xff0c;再利用同一个算式看看另外一个大模型的化简与计算能力。 例1. 化简计算摘要中算式。 下面是与一个大模型的…

mybatis(78/134)

前天学了很多&#xff0c;关于java的反射机制&#xff0c;其实跳过了new对象&#xff0c;然后底层生成了字节码&#xff0c;创建了对应的编码。手搓了一遍源码&#xff0c;还是比较复杂的。 <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE …

数据分箱 baggingboosting onehot独热编码 woe编码 sklearn的ensemble(集成学习)

目录 数据分箱就是将连续变量离散化。 bagging&boosting onehot独热编码 独热编码的结果如下&#xff1a; woe编码 WOE编码的基本原理 步骤一&#xff1a;计算WOE 步骤二&#xff1a;应用WOE WOE编码的优点 示例 数据示例 步骤一&#xff1a;计算每个类别的违约…

企业微信开发010_使用WxJava企业微信开发框架_封装第三方应用企业微信开发003_并且实现多企业授权访问---企业微信开发012

继续来看吧,上一节,已经把config部分,代码都拿过来了: 并且把企业微信第三方应用开发部分,对应的config的配置,mutiltp 代码拿过来了,并且把yml中的配置也给出了. 然后,这里说一下config中的内容,到时候自己看也可以看懂 其实就是封装了,当系统启动,加载企微模块,这个时候,会…

Office2021下载与安装保姆级教程【Office Tool Plus】

Office Tool Plus安装Office2021 下载Office Tool Plus安装OfficeⅠ. 清除旧版本Ⅱ. 配置安装参数Ⅲ. 安装许可证Ⅳ. 激发&#xff08;JH&#xff09;Office 本文介绍使用Office Tool Plus工具下载、安装、部署Office 2021全过程。 下载Office Tool Plus OfficeToolPlus是一个…

Unity在WebGL中拍照和录视频

原工程地址https://github.com/eangulee/UnityWebGLRecoder Unity版本2018.3.6f1&#xff0c;有点年久失修了 https://github.com/xue-fei/Unity.WebGLRecorder 修改jslib适配了Unity2021 效果图 录制的视频 Unity在WebGL中拍照和录视频

【外文原版书阅读】《机器学习前置知识》1.线性代数的重要性,初识向量以及向量加法

目录 ​编辑 ​编辑 1.Chapter 2 Why Linear Algebra? 2.Chapter 3 What Is a Vector? 个人主页&#xff1a;Icomi 大家好&#xff0c;我是Icomi&#xff0c;本专栏是我阅读外文原版书《Before Machine Learning》对于文章中我认为能够增进线性代数与机器学习之间的理解的…

SpringBoot开发(二)Spring Boot项目构建、Bootstrap基础知识

1. Spring Boot项目构建 1.1. 简介 基于官方网站https://start.spring.io进行项目的创建. 1.1.1. 简介 Spring Boot是基于Spring4框架开发的全新框架&#xff0c;设计目的是简化搭建及开发过程&#xff0c;并不是对Spring功能上的增强&#xff0c;而是提供了一种快速使用Spr…

【PyTorch】4.张量拼接操作

个人主页&#xff1a;Icomi 在深度学习蓬勃发展的当下&#xff0c;PyTorch 是不可或缺的工具。它作为强大的深度学习框架&#xff0c;为构建和训练神经网络提供了高效且灵活的平台。神经网络作为人工智能的核心技术&#xff0c;能够处理复杂的数据模式。通过 PyTorch&#xff0…

新电脑安装系统找不到硬盘原因和解决方法来了

有不少网友反馈新电脑采用官方u盘方式装win10或win100出现找不到硬盘是怎么回事&#xff1f;后来研究半天发现是bios中开启了rst(vmd)模式。如果关闭rst模式肯定是可以安装的&#xff0c;但这会影响硬盘性能&#xff0c;有没有办法解决开启rst模式的情况安装win10或win11呢&…

「 机器人 」仿生扑翼飞行器中的“被动旋转机制”概述

前言 在仿生扑翼飞行器的机翼设计中,模仿昆虫翼的被动旋转机制是一项关键技术。其核心思想在于:机翼旋转角度(攻角)并非完全通过主动伺服来控制,而是利用空气动力和惯性力的作用,自然地实现被动调节。以下对这种设计的背景、原理与优势进行详细说明。 1. 背景:昆虫的被动…

Android GLSurfaceView 覆盖其它控件问题 (RK平台)

平台 涉及主控: RK3566 Android: 11/13 问题 在使用GLSurfaceView播放视频的过程中, 增加了一个播放控制面板, 覆盖在视频上方. 默认隐藏setVisibility(View.INVISIBLE);点击屏幕再显示出来. 然而, 在RK3566上这个简单的功能却无法正常工作. 通过缩小视频窗口可以看到, 实际…

【C++】类和对象(五)

1、初始化列表 作用&#xff1a;C提供了初始化列表语法&#xff0c;用来初始化属性。 语法&#xff1a; 构造函数&#xff08;&#xff09;&#xff1a;属性1&#xff08;值1&#xff09;&#xff0c;属性2&#xff08;值2&#xff09;...{}示例&#xff1a; #include<i…