2017-09-16 197 views
0

因此,我试图按照LLVM compiler tutorial一起学习,并试图使用CMake而不是llvm-config构建玩具示例。由于an issue with Ubuntu's packaging system,我决定从源代码构建LLVM并链接到它。所以我按照指示here从源代码构建LLVM 3.7.1。我复制粘贴从LLVM的examples/Kaleidoscope目录中的第3章源代码(因为上面链接教程建议为LLVM的特定版本的使用这样做),打算用以下CMakeLists.txt建造它,从this严重改编:无法链接LLVM编译器教程程序,而无需使用RTTI构建LLVM

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}") 

然而,当我尝试配置和构建它,我得到下面的连接错误:

undefinted reference to `typeinfo for llvm:CmpInst` 

试图连接比核心和支持以外的其他库后,我决定尝试重新建设LLVM与RTTI已启用,并且确实足以编译和链接s当我将-DLLVM_ENABLE_RTTI=ON添加到LLVM cmake调用时成功。

是否可以在没有RTTI的情况下构建LLVM,并且仍然可以成功将它链接到万花筒的例子?看起来很奇怪,如果没有任何教程或LLVM CMake文档提及RTTI,就需要RTTI。

回答

0

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