在Linux下借助CMake使用Clang 和 libc++

libc++是一个架构在LLVM上的C++标准库。

libc++的架构比GCC的libstdc++的架构先进。

因为现在,GCC的代码是杂糅式的,缺乏架构设计。

而LLVM的架构是先进的。

libc++和Clang编译器都是LLVM架构下的不错的项目。

 

首先在现代化的C++项目中,已经没人手写Makefiles了。

CMake工具的引入,方便我们用Clang 和 libc++ 代替GCC 和libstdc++。

 

经过本人的反复探索,我已经找到如何在Linux下借助CMake使用Clang 和 libc++

首先,肯定要安装这些工具。

通过apt install clang, apt install libcxx-dev

 

CMake的调用语句这么写:

cmake -G "Unix Makefiles" -D CMAKE_BUILD_TYPE=Debug -S . -B ./build/

CMakeLists文件这么写:

cmake_minimum_required(VERSION 3.20.4)
# Set the compiler
set(CMAKE_C_COMPILER clang)
set(CMAKE_CXX_COMPILER clang++)
project(Hello-Clang
    VERSION 0.0.1
    DESCRIPTION "A test project"
    LANGUAGES C CXX
    )
# set(CMAKE_CXX_COMPILER "/usr/bin/clang++")
# set(CMAKE_C_COMPILER "/usr/bin/clang")
function (check_os)
    message(STATUS "Checking Operating System Env:")
    message(STATUS "Host information:")
    cmake_host_system_information(RESULT env_info QUERY IS_64BIT OS_NAME OS_PLATFORM OS_RELEASE OS_VERSION)
    list(GET env_info 0 bits)
    message(STATUS "  Is 64-bit: ${bits}")
    list(GET env_info 1 os_name)
    message(STATUS "  OS name: ${os_name}")
    cmake_host_system_information(RESULT host_name QUERY HOSTNAME)
    message(STATUS "  Host name: ${host_name}")
    list(GET env_info 2 os_platform)
    message(STATUS "  OS platform: ${os_platform}")
    list(GET env_info 3 os_release)
    message(STATUS "  OS release: ${os_release}")
    message("")
endfunction()
function (check_compiler)
    message(STATUS "Check C++ Compiler: ${CMAKE_CXX_COMPILER_ID}")
endfunction()
function(main)    
    check_os()
    check_compiler()
    message("   Hello CMake")
    cmake_path(SET path1 "./src/main.cxx")
    
    if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
        # set compiler flags
        add_executable(hello ${path1})
        target_compile_options(hello
            # STD
            PUBLIC -stdlib=libc++
            PUBLIC -std=c++17
            # Diagnose
            PUBLIC -Werror
            # Debug
            PUBLIC -O0
            PUBLIC -glldb
            )
        # set link to libc++
        target_link_options(hello
            PUBLIC -stdlib=libc++
            )
    endif()
        
    message(STATUS "<CMakeLists> executed OVER!")
endfunction()
main()

 

这里值得注意的是,如果只在target_compile_options中指定 -stdlib=libc++

在链接器中也要指定,所以下面有这行代码

target_link_options(hello
PUBLIC -stdlib=libc++
)

以上代码已经在我本机跑过了,确认过没什么问题。

 

这里有一点值得令人惊喜的是,在于CMake的优越性,我们可以通过target_compile_options给clang++编译器添加无数多的CXX_COMPILER_FLAGS,这显然比直接写Makefiles文件爽快,所以按照我的方法添加CXX_COMPILER_FLAGS是准没错的,我测试过了,另外,要想了解更多关于Clang的COMPILER_FLAGS的用途,你应该翻阅一下这个网站:

Clang Compiler User’s Manual — Clang 13 documentation (llvm.org)

总而言之,CMake; clang++; libc++ 是我在Linux下非常喜欢的编译工具链。

CMake是现代化的Buildsystem,LLVM项目的架构和性能也十分先进。

C++程序员们,是时候放弃Makefiles和GCC了。

https://zhuanlan.zhihu.com/p/382156504

libc++还有脸吹了?三家标准质量最差的就是libc++。
流性能比libstdc++慢20倍。到现在C++连个contiguous_range都没有。libstdc++和微软2年前就完工了
libc++的并行stl写好了吗?c++17的东西,打算拖到2022年吗?
而且libc++的pmr也没法用……这也是c++17的东西

posted @ 2019-01-12 00:36  findumars  Views(706)  Comments(0Edit  收藏  举报