所以我试图跟随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。
答案 0 :(得分:1)
想出来!事实证明我的项目是默认使用RTTI构建的,因此只有在使用RTTI构建LLVM时才能正确链接。添加-fno-rtti
编译标志解决了问题。