百度链接地址,扬州抖音seo,签名在线生成器,什么是网站挂马之前笔者写过一篇博文ubuntu使用LLVM官方发布的tar.xz来安装Clang编译器介绍了Ubuntu下使用官方发布的tar.xz包来安装Clang编译。官方发布的版本中也有MacOS版本的tar.xz#xff0c;那MacOS应该也是可以安装的。
笔者2015款MBP笔记本#xff0c;CPU是intel的#xff0c;出厂…之前笔者写过一篇博文ubuntu使用LLVM官方发布的tar.xz来安装Clang编译器介绍了Ubuntu下使用官方发布的tar.xz包来安装Clang编译。官方发布的版本中也有MacOS版本的tar.xz那MacOS应该也是可以安装的。
笔者2015款MBP笔记本CPU是intel的出厂系统是MacOS10.12Sierra后面自己升级安装到10.13由于只有128G硬盘不能安装太新的系统 目前的Clang编译器是9.0__cplusplus版本是201406支持C14部分支持C17如果想使用新一点的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版本 先下载clangllvm-15.0.7-x86_64-apple-darwin21.0.tar.xz 再使用下面的命令解压
tar -xf clangllvm-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 errno1
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 15VSCode会自动重新执行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.无法正确执行CMakeCMake在编译简单的测试程序时无法通过。
ld: unknown option: -platform_version提示是ld找到不到参数原因是新版本的Clang编译器与系统的链接器ld不匹配需要使用Clang自己的链接器lld由于是CMake在测试编译器时报的错那就需要在它之前设置使用lld。
CMake中要设置链接器使用lld有两种方法
可以在cmake命令行参数中设置如下变量
CMAKE_EXE_LINKER_FLAGS设置可执行文件链接器的变量用法-DCMAKE_EXE_LINKER_FLAGS-fuse-ldlld注意大小写CMAKE_SHARED_LINKER_FLAGS设置动态链接库链接器的变量用法-DCMAKE_SHARED_LINKER_FLAGS-fuse-ldlldCMAKE_LINK_LIBRARY_FLAG设置静态链接库链接器的旗标用法-DCMAKE_LINK_LIBRARY_FLAG-fuse-ldlldCMAKE_LINKER_TYPE在3.29版本添加的新变量用法-DCMAKE_LINKER_TYPELLD注意LLD是大写
在VSCode中需要在settings.json配置文件中设置
cmake.configureArgs: [-DCMAKE_EXE_LINKER_FLAGS-fuse-ldlld,-DCMAKE_SHARED_LINKER_FLAGS-fuse-ldlld,-DCMAKE_LINK_LIBRARY_FLAG-fuse-ldlld,-DCMAKE_LINKER_TYPELLD // CMake3.29才能使用
],在CMakeLists.txt中设置 如果是在CMakeLists.txt中设置一定要在最顶层的CMakeLists.txt中project命令之前设置
cmake_minimum_required(VERSION 3.25)
set(CMAKE_EXE_LINKER_FLAGS -fuse-ldlld)
set(CMAKE_SHARED_LINKER_FLAGS -fuse-ldlld)
set(CMAKE_LINK_LIBRARY_FLAG -fuse-ldlld)
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-ldlld
CMAKE_LINK_LIBRARY_FLAG:STRING-fuse-ldlld
CMAKE_SHARED_LINKER_FLAGS:STRING-fuse-ldlld如下图所示 在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_exit和quick_exit函数在C11中添加而std::at_quick_exit和std::quick_exit函数在C11中添加参见 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是在C17中添加参见 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.hint 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即可。 不报警告了但是在代码中不能使用这几个函数因为系统中没有相应的实现。
如果对你有帮助欢迎点赞收藏