banner
NEWS LETTER

编译C3C源码

Scroll down

前言

关于 c3c 从源码构建, 遇到的一些坑: 当前 (2025-03-21) 根据 c3c 文档中介绍的从源码构建, 简单的几行命令就可以 build 出来编译器了, 但我在实际的操作中, 一直卡在 Loading Windows LLVM libraries, this may take a while..., 重试几次无果, 于是乎翻构建脚本看看

准备

目标平台是 windows, 其他平台不在此笔记中记载

因为我主力机是 windows, 所以 Unix 系列没去 build, 听群友说是无痛编译

开始之前列举一下相关文档:

build前需要准备的环境如下:

  • msvc, 「visual studio installer」 中勾选上 「使用 C++ 的桌面开发」 安装即可 (这里如果不适用 msvc, 改用 mingw 应该也可以, 但是我没有实践)
  • cmake

构建

直接跳到 补充 段落修改编译脚本(简单省事), 然后再根据下面的命令执行步骤跑一遍就可以了

  • git clone git@github.com:c3lang/c3c.git
  • cd c3c
  • 修改 CMakeLists.txt
    • line: 121 ~ 152
      # if(CMAKE_C_COMPILER_ID STREQUAL "MSVC")
      #     if (C3_LLVM_VERSION STREQUAL "auto")
      #         set(C3_LLVM_VERSION "19")
      #     endif()
      #     FetchContent_Declare(
      #             LLVM_Windows
      #             URL https://github.com/c3lang/win-llvm/releases/download/llvm_19_1_5/llvm-19.1.5-windows-amd64-msvc17-libcmt.7z
      #     )
      #     FetchContent_Declare(
      #             LLVM_Windows_debug
      #             URL https://github.com/c3lang/win-llvm/releases/download/llvm_19_1_5/llvm-19.1.5-windows-amd64-msvc17-libcmt-dbg.7z
      #     )
      #     if(CMAKE_BUILD_TYPE STREQUAL "Debug")
      #         message("Loading Windows LLVM debug libraries, this may take a while...")
      #         FetchContent_MakeAvailable(LLVM_Windows_debug)
      #         set(llvm_dir ${llvm_windows_debug_SOURCE_DIR})
      #     else()
      #         message("Loading Windows LLVM libraries, this may take a while...")
      #         FetchContent_MakeAvailable(LLVM_Windows)
      #         set(llvm_dir ${llvm_windows_SOURCE_DIR})
      #     endif()
      #     set(CMAKE_SYSTEM_PREFIX_PATH ${llvm_dir} ${CMAKE_SYSTEM_PREFIX_PATH})
      
      #     find_package(LLVM REQUIRED CONFIG)
      #     find_package(LLD REQUIRED CONFIG)
      # else()
      #     if (NOT C3_LLVM_VERSION STREQUAL "auto")
      #         find_package(LLVM ${C3_LLVM_VERSION} REQUIRED CONFIG)
      #     else()
      #         find_package(LLVM REQUIRED CONFIG)
      #     endif()
      # endif()
    • 上面部分 cmake 脚本是默认 msvc 环境下就会去远端拉取 llvm 环境, 注释掉或者直接删除, 替换成下面的脚本. 其中 LLVM_DIR 设置成自己 llvm 实际的安装路径即可
      if(CMAKE_C_COMPILER_ID STREQUAL "MSVC")
          if (C3_LLVM_VERSION STREQUAL "auto")
              set(C3_LLVM_VERSION "19.1.5")
          endif()
      
          # 手动设置本地 LLVM
          set(LLVM_DIR "D:/LLVM" CACHE PATH "Path to LLVM cmake directory")
          find_package(LLVM ${C3_LLVM_VERSION} REQUIRED CONFIG)
          find_package(LLD REQUIRED CONFIG)
      else()
          if (NOT C3_LLVM_VERSION STREQUAL "auto")
              find_package(LLVM ${C3_LLVM_VERSION} REQUIRED CONFIG)
          else()
              find_package(LLVM REQUIRED CONFIG)
          endif()
      endif()
  • mkdir build
  • cd build
  • cmake ..
  • cmake –build .

构建完毕, build 目录下生成 c3c.exe

补充

莫名奇妙的, 第二天到公司电脑编源码, 还是一样的配置 环境, 硬是不行 (找不到问题, 后面把 CMakeLists.txt 一通乱改测试编译), 后面发现没必要改这么一大段, 简单替换一下 fetch 部分就好了:

我就只下载了一个 debug 的 llvm, 所以替换成一样的了

if(CMAKE_BUILD_TYPE STREQUAL "Debug")
    message("Loading Windows LLVM debug libraries, this may take a while...")
    # FetchContent_MakeAvailable(LLVM_Windows_debug)
    set(llvm_dir "D:/llvm-19.1.5-windows-amd64-msvc17-libcmt-dbg" CACHE PATH "Path to LLVM cmake directory")
    set(llvm_dir ${llvm_windows_debug_SOURCE_DIR})
else()
    message("Loading Windows LLVM libraries, this may take a while...")
    # FetchContent_MakeAvailable(LLVM_Windows)
    set(llvm_dir "D:/llvm-19.1.5-windows-amd64-msvc17-libcmt-dbg" CACHE PATH "Path to LLVM cmake directory")
    set(llvm_dir ${llvm_windows_SOURCE_DIR})
endif()

测试

还是在 build 目录中

c3c compile-run  ../resources/testfragments/helloworld.c3

打印输出如下, 即 c3c 环境搭建完成

E:\Code\c3c\build>c3c compile-run  ../resources/testfragments/helloworld.c3
Launching helloworld.exe
Hello, World!
Program completed with exit code 0.

I'm so cute. Please give me money.

其他文章
cover
UE配置Git版本控制
  • 2024-11-03
  • 18:11:21
  • 笔记
目录导航 置顶
  1. 1. 前言
  2. 2. 准备
  3. 3. 构建
    1. 3.1. 补充
  4. 4. 测试
请输入关键词进行搜索