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

,再使用下面的命令解压:

bash 复制代码
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变量中:

bash 复制代码
export PATH=/usr/local/llvm-15/bin:$PATH

二、测试、使用

1.简单测试

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

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

但是测试lldb就报错了:

bash 复制代码
$ 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指令查看:

bash 复制代码
$ 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命令:

bash 复制代码
[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配置文件中设置:

bash 复制代码
"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命令之前设置:
bash 复制代码
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中添加如下配置:

bash 复制代码
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源码:

cpp 复制代码
#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

c 复制代码
#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"即可。

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

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

相关推荐
努力冲冲2 小时前
使用Visual Studio Code实现文件比较功能
ide·vscode·编辑器
不想被吃掉氩5 小时前
CMAKE
windows·unix·cmake
zh4men95 小时前
Mac Parallels Desktop Kali 2025 代理设置
服务器·网络·macos·kali·pdesktop
2401_888567005 小时前
Mac电脑 窗口分屏管理 Magnet Pro
macos·mac·分屏
卖猪肉的痴汉7 小时前
5.3 VSCode使用FFmpeg库
ide·vscode·ffmpeg
CBCU18 小时前
关于ubuntu环境下vscode进行debug的随笔
linux·vscode·ubuntu
扛麻袋的少年20 小时前
vscode 开发nuxt,点击标签跳转到 components.d.ts 解决方案
vscode·nuxt3
Digitally21 小时前
如何轻松地将音乐从 iPhone 传输到 Mac?
macos·ios·iphone
come1123421 小时前
VS Code 项目中的 .vscode 目录详解
ide·vscode·编辑器
伊织code21 小时前
macOS - 根据序列号查看机型、保障信息
macos·mac·macbook·查看·序列号·机型·对应