swe*_*ish 9 c++ macos homebrew cmake
我的目标是为我的 cmake 命令设置别名,以便它专门使用我的 llvm 自制安装,而不是 Xcode 安装的套件。我也想保留系统默认值。我在 Catalina 上使用最新的 Xcode 和 homebrew llvm。
我的第一步是使用自制的 clang++ 和 libc++,我可以手动完成
/usr/local/opt/llvm/bin/clang++ -Wall -Wextra -std=c++17 -stdlib=libc++ \
-nostdinc++ -I/usr/local/opt/llvm/include/c++/v1 \
-L/usr/local/opt/llvm/lib -Wl,-rpath,/usr/local/opt/llvm/lib \
main.cc
Run Code Online (Sandbox Code Playgroud)
为了完整起见,这是我的 CMakeLists.txt;它非常准系统,因为我想做的大部分工作不属于 CMakeLists.txt,我只是想编译一个玩具程序。
cmake_minimum_required(VERSION 3.15)
project(test)
set(CMAKE_CXX_STANDARD 17)
add_executable(test
main.cc)
Run Code Online (Sandbox Code Playgroud)
但我已经被 cmake 困住了。我可以使用
-DCMAKE_CXX_COMPILER="/usr/local/opt/llvm/bin/clang++C/clang 指定编译器。我也在使用CMAKE_PREFIX_PATH,但是当我打开build.ninja文件时,我仍然看到它引用 Xcode 目录。添加 aCMAKE_IGNORE_PATH似乎并没有让它真正忽略 /Applications/Xcode.app。
我还尝试将标志CMAKE_CXX_STANDARD_LIBRARIES和添加CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES到我的 cmake 命令中,但如果我这样做,我开始出现链接器错误(我相信仍然使用系统链接器而不是自制程序的 ld64.lld)。
这是我当前工作的 cmake 命令作为参考:
cmake -DCMAKE_PREFIX_PATH="/usr/local/opt/llvm" \
-DCMAKE_CXX_COMPILER="/usr/local/opt/llvm/bin/clang++" \
-DCMAKE_C_COMPILER="/usr/local/opt/llvm/bin/clang" -G Ninja ..
Run Code Online (Sandbox Code Playgroud)
仍然需要特定的编译器路径,因为 cmake 可以轻松直接连接到 AppleClang。
我知道路径重复很烦人,但我希望在开始修改 .zshrc 之前有一个完整的命令可以工作。
这是损坏的命令(因为构建程序不再成功而损坏,cmake 不会在这里抱怨):
cmake -DCMAKE_IGNORE_PATH="/Applications/Xcode.app" -DCMAKE_PREFIX_PATH="/usr/local/opt/llvm" \
-DCMAKE_CXX_COMPILER="/usr/local/opt/llvm/bin/clang++" \
-DCMAKE_C_COMPILER="/usr/local/opt/llvm/bin/clang" \
-DCMAKE_CXX_STANDARD_LIBRARIES="/usr/local/opt/llvm/lib" \
-DCMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES="/usr/local/opt/llvm/include/c++/v1" \
-G Ninja ..
Run Code Online (Sandbox Code Playgroud)
带有构建错误消息:
[2/2] Linking CXX executable test
FAILED: test
: && /usr/local/opt/llvm/bin/clang++ -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/test.dir/main.cc.o -o test /usr/local/opt/llvm/lib && :
ld: can't map file, errno=22 file '/usr/local/opt/llvm/lib' for architecture x86_64
clang-9: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
Run Code Online (Sandbox Code Playgroud)
该变量CMAKE_CXX_LINK_EXECUTABLE只是被忽略,因此不包括在内。
如果有人有任何指导,我将不胜感激。我发现的有关此问题的所有链接通常都会覆盖系统默认设置,如果可能的话,我想避免这样做。