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.pswp.cn/web/66754.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66754.shtml
英文地址,請注明出處:http://en.pswp.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;還沒…

Pytorch深度學習指南 卷I --編程基礎(A Beginner‘s Guide) 第1章 一個簡單的回歸

本章正式開始使用pytorch的接口來實現對應的numpy的學習的過程&#xff0c;來學習模型的實現&#xff0c;我們會介紹numpy是如何學習的&#xff0c;以及我們如何一步步的通過torch的接口來實現簡單化的過程&#xff0c;優雅的展示我們的代碼&#xff0c;已經我們的代碼完成的事…

String.join()

String.join() 方法是 Java 8 及其以上版本中的一個方法&#xff0c;用于將多個字符串用指定的分隔符連接成一個字符串。 其語法為&#xff1a; java復制 String joinedString String.join(CharSequence delimiter, CharSequence... elements); 在這個方法中&#xff1a;…

FastAPI 數據庫配置最佳實踐

FastAPI 數據庫配置最佳實踐 1. 基礎配置 1.1 數據庫連接配置 from sqlalchemy import create_engine, event from sqlalchemy.orm import sessionmaker, declarative_base from sqlalchemy.pool import QueuePool from sqlalchemy.exc import SQLAlchemyError import loggi…

深度解析 Java 的幻讀現象與應對策略

目錄 一、幻讀現象的本質 二、幻讀在 Java 數據庫編程中的體現 三、幻讀帶來的問題 四、應對幻讀的策略 1. 數據庫隔離級別 2. 應用層解決方案 五、總結 在 Java 的數據庫編程領域&#xff0c;幻讀是一個不容忽視的概念。它涉及到數據庫事務處理過程中數據一致性的關鍵問…

Glary Utilities Pro 多語便攜版系統優化工具 v6.21.0.25

Glary Utilities是一款功能強大的系統優化工具軟件&#xff0c;旨在幫助用戶清理計算機垃圾文件、修復系統錯誤、優化系統性能等。 軟件功能 清理和修復&#xff1a;可以清理系統垃圾文件、無效注冊表項、無效快捷方式等&#xff0c;修復系統錯誤和藍屏問題。 優化和加速&…

【貪心算法】洛谷P1106 - 刪數問題

2025 - 12 - 26 - 第 46 篇 【洛谷】貪心算法題單 - 【貪心算法】 - 【學習筆記】 作者(Author): 鄭龍浩 / 仟濹(CSND賬號名) 目錄 文章目錄 目錄P1106 刪數問題題目描述輸入格式輸出格式樣例 #1樣例輸入 #1樣例輸出 #1 提示思路代碼 P1106 刪數問題 題目描述 鍵盤輸入一個高…

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…

Linux 目錄操作詳解

Linux目錄操作詳解 1. 獲取當前工作目錄1.1 getcwd()1.2 get_current_dir_name() 2. 切換工作目錄2.1 chdir() 3. 創建和刪除目錄3.1 mkdir()3.2 rmdir() 4. 獲取目錄中的文件列表4.1 opendir() 打開目錄4.2 readdir() 讀取目錄內容4.3 closedir() 關閉目錄 5. dirent 結構體6.…

Spring 依賴注入詳解:創建 Bean 和注入依賴是一回事嗎?

1. 什么是依賴注入&#xff08;Dependency Injection&#xff0c;DI&#xff09;&#xff1f; 依賴注入 是 Spring IoC&#xff08;控制反轉&#xff09;容器的核心功能。它的目標是將對象的依賴&#xff08;如其他對象或配置&#xff09;從對象本身中剝離&#xff0c;由容器負…

AI時代的網絡安全:傳統技術的落寞與新機遇

AI時代的網絡安全&#xff1a;傳統技術的落寞與新機遇 在AI技術飛速發展的浪潮中&#xff0c;網絡安全領域正經歷著前所未有的變革。一方面&#xff0c;傳統網絡安全技術在面對新型攻擊手段時逐漸顯露出局限性&#xff1b;另一方面&#xff0c;AI為網絡安全帶來了新的機遇&…

后端開發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張表、單個…