无法在不使用RTTI构建LLVM的情况下链接LLVM编译器教程程序

时间:2017-09-16 20:52:44

标签: c++ cmake llvm

所以我试图跟随LLVM compiler tutorial并尝试使用CMake而不是llvm-config来构建玩具示例。由于an issue with Ubuntu's packaging system,我决定从源代码构建LLVM并链接到它。所以我按照here的说明从源代码构建了LLVM 3.7.1。我从LLVM的examples/Kaleidoscope目录中复制粘贴了第3章源代码(因为上面链接的教程建议对你使用的特定版本的LLVM这样做),并尝试使用以下{{1}来构建它。 },大量改编自this

CMakeLists.txt

但是,当我尝试配置和构建它时,我收到以下链接器错误:

cmake_minimum_required(VERSION 3.5.1)

project(llvm-test-project)

find_package(LLVM REQUIRED CONFIG)

message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}")
message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}")
message(STATUS "LLVM built with RTTI? ${LLVM_ENABLE_RTTI}")

add_executable(toy toy.cpp)
set_property(TARGET toy PROPERTY CXX_STANDARD 11)

include_directories(${LLVM_INCLUDE_DIRS})
add_definitions(${LLVM_DEFINITIONS})
llvm_map_components_to_libnames(llvm_libs core support)
target_link_libraries(toy ${llvm_libs})
message(STATUS "LLVM linked to: ${llvm_libs}")

在尝试链接到除核心和支持之外的其他库之后,我决定尝试在启用RTTI的情况下重新构建LLVM,当然,当我将undefinted reference to `typeinfo for llvm:CmpInst` 添加到LLVM时,它会成功编译和链接{{ 1}}调用。

是否可以在没有RTTI的情况下构建LLVM并仍然成功将其链接到Kaleidoscope示例?看起来很奇怪,在没有提及教程或LLVM CMake文档的情况下需要RTTI。

1 个答案:

答案 0 :(得分:1)

想出来!事实证明我的项目是默认使用RTTI构建的,因此只有在使用RTTI构建LLVM时才能正确链接。添加-fno-rtti编译标志解决了问题。