标签:clang

以下是与标签 “clang” 相关联的文章

windows 下 clang 编译后无法查看 string 变量值问题

ubuntu 上用 lldb 可以正常调试,在 windows 上用 gdb 无法调试。开始以为是 mingw/clang/gdb 间的版本差异无法查看 std::string 变量值,尝试了各种版本组合,都不行。

stackoverflow 上找到了这个回答,原因是 clang 默认不生成 std::string 的调试信息,需要另外安装 libstdc++ 的编译符号表才能调试。

在 cmake 中加入这个编译选项,可以解决此问题

if((CMAKE_BUILD_TYPE STREQUAL Debug) OR (CMAKE_BUILD_TYPE STREQUAL RelWithDebInfo))
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-limit-debug-info")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-limit-debug-info")
endif()

另外需要注意的是:

  • mingw 版本升级后,影响头文件和 lib 兼容,经常需要修改代码才能编译通过。
  • clang 版本升级仅影响二进制兼容,不影响代码兼容。
  • 目前比较稳定的组合是 clang400 + mingw540

windows 下安装 clang5.0

  • 下载 llvm5.0-win64 ,安装到 D:/llvm64-500
  • 下载 MinGW-W64 GCC-5.4.0 x86_64-posix-seh , 安装到 D:/mingw64-540
    • 5.4.0 当前的稳定版本(Qt 当前使用 5.3.0)
    • x86_64 是 64 位版本, i686 是 32 位版本
    • posix 支持 c++11 线程,win32 无 c++11 线程特性
    • clang 默认连接 seh 版本,不能用 sjlj 版本
  • D:/llvm64-500/bin D:/mingw64-540/bin 添加到 PATH 变量
  • 添加下列环境变量

    CC=clang
    CXX=clang++
    CFLAGS=-target x86_64-pc-windows-gnu
    CXXFLAGS=-target x86_64-pc-windows-gnu
    
  • clang3.7 版本之前,不需要设置 CFLAGS CXXFLAGS 编译目标,因为 windows 下仅支持 MinGW 编译工具;clang3.8 版本之后,需要设置编译目标,因为可以支持 MSVC 编译工具,默认编译目标是 i686-pc-windows-msvc 。修改编译目标为 x86_64-pc-windows-gnu .
  • clang 的 -target 编译目标需要在命令行中指定,gcc 可以直接从环境变量中读取。
  • 如果需要 64 位编译环境,则 llvm 和 mingw 都要安装 64 位版本的。
  • 如果是 64 位系统,可以直接安装 llvm 64 位,兼容编译 32 位和 64 位程序
  • 切换 64/32 位编译系统,需要做以下设置(LLVM 使用 64 位,不用切换)
    • 切换环境变量 CFLAGS, CXXFLAGS, LDFLAGS
    • 切换 PATH mingw32-540/mingw64-540
    • clion toolchain 切换 mingw32/mingw64