在 Windows 上使用 CMake 和 MinGW 链接 LLVM 库

Posted

技术标签:

【中文标题】在 Windows 上使用 CMake 和 MinGW 链接 LLVM 库【英文标题】:Linking LLVM libraries on Windows with CMake and MinGW 【发布时间】:2019-02-19 18:55:39 【问题描述】:

我一直在编写一个使用 LLVM 作为后端的编译器。到目前为止,我编写的 CMake 文件都可以在 Linux 上运行,但我在 Windows 上没有任何运气。该项目被拆分为一个库和“驱动程序”可执行文件,它们自己的 CMakeLists.txt 位于单独的子目录中。 顶层 CMakeLists.txt 如下所示:

cmake_minimum_required (VERSION 3.7.0)
project (compiler)

set (CMAKE_CXX_STANDARD 14)
set (CMAKE_CXX_STANDARD_REQUIRED ON)
set (CMAKE_CXX_EXTENSIONS OFF)

find_package (LLVM REQUIRED CONFIG)
message (STATUS "Found LLVM $LLVM_PACKAGE_VERSION")
message (STATUS "Using LLVMConfig.cmake in: $LLVM_DIR")

include_directories ($LLVM_INCLUDE_DIRS)
add_definitions($LLVM_DEFINITIONS)

add_subdirectory (Compiler_Lib)
add_subdirectory (Compiler_exe)

库的 CMakeLists.txt:

cmake_minimum_required (VERSION 3.7.0)

add_library (compiler_lib 
        AST.cpp
        AST.h
        parser.cpp
        parser.h
        scanner.cpp
        scanner.h
        token.cpp
        token.h
        visualizer.cpp
        visualizer.h
        codegen.cpp
        codegen.h)

target_include_directories (compiler_lib PUBLIC $CMAKE_CURRENT_SOURCE_DIR)

target_link_libraries(compiler_lib LLVM)

还有可执行文件的 CMakeLists.txt(链接到库失败的地方):

cmake_minimum_required (VERSION 3.7.0)
project (compiler_exe)

add_executable (compiler_exe Compiler_exe.cpp getopt.h getopt.cpp)
target_link_libraries (compiler_exe LINK_PUBLIC LLVM compiler_lib)

我运行命令"c:\Program Files\CMake\bin\cmake.exe" .. -G"MinGW Makefiles" -DCMAKE_PREFIX_PATH=C:\Users\James\llvm+clang-7.0.0-win64-msvc-release,其中C:\Users\James\llvm+clang-7.0.0-win64-msvc-release 是预构建LLVM 库的路径。但是,之后运行 mingw32-make 失败并显示输出

Scanning dependencies of target compiler_lib
[ 10%] Building CXX object Compiler_Lib/CMakeFiles/compiler_lib.dir/AST.cpp.obj
[ 20%] Building CXX object Compiler_Lib/CMakeFiles/compiler_lib.dir/parser.cpp.obj
[ 30%] Building CXX object Compiler_Lib/CMakeFiles/compiler_lib.dir/scanner.cpp.obj
[ 40%] Building CXX object Compiler_Lib/CMakeFiles/compiler_lib.dir/token.cpp.obj
[ 50%] Building CXX object Compiler_Lib/CMakeFiles/compiler_lib.dir/visualizer.cpp.obj
[ 60%] Building CXX object Compiler_Lib/CMakeFiles/compiler_lib.dir/codegen.cpp.obj
[ 70%] Linking CXX static library libcompiler_lib.a
[ 70%] Built target compiler_lib
Scanning dependencies of target compiler_exe
[ 80%] Building CXX object Compiler_exe/CMakeFiles/compiler_exe.dir/Compiler_exe.cpp.obj
[ 90%] Building CXX object Compiler_exe/CMakeFiles/compiler_exe.dir/getopt.cpp.obj
[100%] Linking CXX executable compiler_exe.exe
c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: cannot find -lLLVM
collect2.exe: error: ld returned 1 exit status
Compiler_exe\CMakeFiles\compiler_exe.dir\build.make:102: recipe for target 'Compiler_exe/compiler_exe.exe' failed
mingw32-make[2]: *** [Compiler_exe/compiler_exe.exe] Error 1
CMakeFiles\Makefile2:176: recipe for target 'Compiler_exe/CMakeFiles/compiler_exe.dir/all' failed
mingw32-make[1]: *** [Compiler_exe/CMakeFiles/compiler_exe.dir/all] Error 2
Makefile:82: recipe for target 'all' failed
mingw32-make: *** [all] Error 2

这是我第一次使用 CMake,所以我可能会遗漏一些明显的东西,但正如我所说,它似乎在 Linux 上工作。

【问题讨论】:

库名称LLVM 似乎是Linux-特定的。你可以使用llvm_map_components_to_libnames函数收集llvm库,或者使用llvm_add_library而不是add_library @Tsyvarev 谢谢,我尝试过使用llvm_map_components_to_libnames,但遇到了 LTO 库的问题。我收到消息mingw32-make[2]: *** No rule to make target 'LTO-NOTFOUND', needed by 'Compiler_exe/compiler_exe.exe'. Stop. 这可能与共享 LTO 库的事实有关,但我不确定。 【参考方案1】:

要使链接成功,需要满足以下两点:

1) 文件 libLLVM.a 需要存在 2) 该文件必须位于库搜索路径中的目录中

应该有一种方法可以让 cmake 告诉您它搜索库的位置列表,并且您需要找到一种方法来获取 libLLVM.a 存在于该目录列表中的任何位置。

抱歉部分答案,但这是故障排除路径...

【讨论】:

以上是关于在 Windows 上使用 CMake 和 MinGW 链接 LLVM 库的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 上使用 CMake 和 MinGW 链接 LLVM 库

在 Windows 10 上使用 Armadillo 作为库与 CLion 和 CMake 的问题

如何使用 CMAKE 从命令行在 Windows 上构建 x86 和/或 x64?

(转)Windows上使用CMake

使用 CMake 在 Windows 10 上构建 uWebSockets

vscode+windows7+gcc+cmake