2017-09-16 36 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編譯標誌修復了問題。