前言
关于 c3c 从源码构建, 遇到的一些坑: 当前 (2025-03-21
) 根据 c3c 文档中介绍的从源码构建, 简单的几行命令就可以 build 出来编译器了, 但我在实际的操作中, 一直卡在 Loading Windows LLVM libraries, this may take a while...
, 重试几次无果, 于是乎翻构建脚本看看
准备
目标平台是 windows
, 其他平台不在此笔记中记载
因为我主力机是
windows
, 所以Unix
系列没去 build, 听群友说是无痛编译
开始之前列举一下相关文档:
- c3官方文档, 安装, 使用的详情都在这了
- c3文档指向的 llvm 版本, 我是直接到 llvm仓库自己安装的
- c3源码,
git clone git@github.com:c3lang/c3c.git
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()
- line: 121 ~ 152
- 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.