使用CMake和LLVM时出现错误

8

我正在尝试使用LLVM构建玩具编译器,并希望使用CMake作为构建系统。我尝试使用LLVM网站上的示例CMakeLists.txt, 但在运行cmake时遇到以下错误:

CMake Error at /usr/share/llvm-3.8/cmake/LLVMConfig.cmake:178  (include):
  include could not find load file:

    /usr/share/llvm/cmake/LLVMExports.cmake
Call Stack (most recent call first):
  CMakeLists.txt:4 (find_package)


CMake Error at /usr/share/llvm-3.8/cmake/LLVMConfig.cmake:181 (include):
  include could not find load file:

    /usr/share/llvm/cmake/LLVM-Config.cmake
Call Stack (most recent call first):
  CMakeLists.txt:4 (find_package)

当我去调查这个问题时,我发现我的系统上的路径实际上是 /usr/share/llvm-3.8/。当我尝试将路径更改为它期望的 /usr/share/llvm/ 时,我收到了另一个错误:
CMake Error at /usr/share/llvm/cmake/LLVMExports.cmake:1034 (message):
  The imported target "LLVMSupport" references the file

     "/usr/lib/libLLVMSupport.a"

  but this file does not exist.  Possible reasons include:

  * The file was deleted, renamed, or moved to another location.

  * An install or uninstall procedure did not complete successfully.

  * The installation package was faulty and contained

     "/usr/share/llvm/cmake/LLVMExports.cmake"

  but not all the files it references.

我不是一个关于CMake如何工作的专家,所以我不确定该从哪里开始。我正在运行Ubuntu 16.04,并尝试通过各种不同的包安装LLVM,但结果都相同。这是Ubuntu打包系统的问题,还是我可以修复的问题?


当位于/usr/share/llvm-3.8下的文件想要包含一个没有版本后缀的文件,位于/usr/share/llvm/下时,对于我来说,这个文件似乎有99%的问题。请注意,用于find_package()的文件大多数不可重定位。您安装了哪些确切的llvm软件包?哪个软件包包含/usr/share/llvm-3.8/cmake/LLVMConfig.cmake/usr/share/llvm/cmake/LLVMExports.cmake文件? - Tsyvarev
我通过Ubuntu的软件包管理器安装了llvm-3.8,这就是为什么我觉得它只是带有错误链接的打包软件。 - AUD_FOR_IUV
你有检查过同一软件包是否附带了“.cmake”文件吗? - Tsyvarev
看起来封装在 /usr/share/llvm-3.8/ 的 .cmake 文件引用了 /usr/share/llvm 中的文件。 - AUD_FOR_IUV
5个回答

5
据我所知,这是Ubuntu打包中众所周知的一个bug。在Ubuntu 16.04上的llvm-3.8-dev中,原始问题仍然存在,请参见此处此处
当试图通过手动设置导入前缀来修复LLVMExports.cmake时,可能会遇到一些问题。
set(_IMPORT_PREFIX "/usr/lib/llvm-3.8")

CMake能够找到libLLVMSupport.a和其他库文件。但是我遇到了以下问题。
 The imported target "PollyISL" references the file

    "/usr/lib/llvm-3.8/lib/libPollyISL.a"

 but this file does not exist.  Possible reasons include:

令人惊讶的是,在LLVM安装目录中甚至不存在库libPollyISL.a。因此,问题不仅仅是CMake配置的问题。

为了节省时间,您可以从源代码构建LLVM并设置LLVM_DIR环境变量。请参阅此教程


4
最简单的选择是安装一个没有这个问题的LLVM版本:在执行以下命令后,该错误对我来说消失了:
apt-get remove llvm
apt-get autoremove
apt-get install llvm-3.9

(在Ubuntu 16.04上测试过。)

1
你需要修复 LLVMExports.cmake,而不是使用 LLVMExports-relwithdebinfo.cmake
在 /usr/share/llvm-3.8/cmake 中,你可以找到 LLVMExports-relwithdebinfo.cmake 文件。
打开该文件后,请手动设置导入前缀。
  # Commands may need to know the format version.                                                                                                                                                        
  set(CMAKE_IMPORT_FILE_VERSION 1)                                                                                                                                                                       
  set(_IMPORT_PREFIX "/usr/lib/llvm-3.8")     

将与-polly相关的所有库都注释掉。

# Import target "PollyISL" for configuration "RelWithDebInfo"                                                                                                                                               
# set_property(TARGET PollyISL APPEND PROPERTY IMPORTED_CONFIGURATIONS RELWITHDEBINFO)                                                                                                                      
# set_target_properties(PollyISL PROPERTIES                                                                                                                                                                 
#   IMPORTED_LINK_INTERFACE_LANGUAGES_RELWITHDEBINFO "C"                                                                                                                                                    
#   IMPORTED_LOCATION_RELWITHDEBINFO "${_IMPORT_PREFIX}/lib/libPollyISL.a"                                                                                                                                  
#   )                                                                                                                                                                                                       
#                                                                                                                                                                                                           
# list(APPEND _IMPORT_CHECK_TARGETS PollyISL )                                                                                                                                                              
# list(APPEND _IMPORT_CHECK_FILES_FOR_PollyISL "${_IMPORT_PREFIX}/lib/libPollyISL.a" )                                                                                                                      
#                                                                                                                                                                                                           
# # Import target "Polly" for configuration "RelWithDebInfo"                                                                                                                                                
# set_property(TARGET Polly APPEND PROPERTY IMPORTED_CONFIGURATIONS RELWITHDEBINFO)                                                                                                                         
# set_target_properties(Polly PROPERTIES                                                                                                                                                                    
#   IMPORTED_LINK_INTERFACE_LANGUAGES_RELWITHDEBINFO "CXX"                                                                                                                                                  
#   IMPORTED_LOCATION_RELWITHDEBINFO "${_IMPORT_PREFIX}/lib/libPolly.a"                                                                                                                                     
#   )                                                                                                                                                                                                       
#                                                                                                                                                                                                           
# list(APPEND _IMPORT_CHECK_TARGETS Polly )                                                                                                                                                                 
# list(APPEND _IMPORT_CHECK_FILES_FOR_Polly "${_IMPORT_PREFIX}/lib/libPolly.a" )                                                                                                                            
#                                                                                                                                                                                                           
# # Import target "LLVMPolly" for configuration "RelWithDebInfo"                                                                                                                                            
# set_property(TARGET LLVMPolly APPEND PROPERTY IMPORTED_CONFIGURATIONS RELWITHDEBINFO)                                                                                                                     
# set_target_properties(LLVMPolly PROPERTIES                                                                                                                                                                
#   IMPORTED_LOCATION_RELWITHDEBINFO "${_IMPORT_PREFIX}/lib/LLVMPolly.so"                                                                                                                                   
#   IMPORTED_NO_SONAME_RELWITHDEBINFO "TRUE"                                                                                                                                                                
#   )                                                                                                                                                                                                       
#                                                                                                                                                                                                           
# list(APPEND _IMPORT_CHECK_TARGETS LLVMPolly )                                                                                                                                                             
# list(APPEND _IMPORT_CHECK_FILES_FOR_LLVMPolly "${_IMPORT_PREFIX}/lib/LLVMPolly.so" )  

然后在 /usr/lib/llvm-3.8/lib

sudo ln -s ../../x86_64-linux-gnu/libLLVM-3.8.so.1 ./libLLVM-3.8.so.1  

0

我在今天遇到了这个问题 (20190103),当时在处理 [SO]: 链接LLVM导致gcov失败(@CristiFati's answer)

环境:

  • Ubuntu 16 pc064

  • CMake 3.5.1

  • GCC 5.4.0

  • LLVM 3.8.0 (llvm-3.8-dev)

出现了两种错误 (在 .cmake 文件中):

  • 对错误路径的引用(版本(3.8)缺失):

    • 对其他.cmake文件的引用(通过包含)

    • 对库文件(.a, .so)和可执行文件的引用

  • 对不存在的库文件和可执行文件的引用

没有过多研究根本原因,我修复了位于/usr/share/llvm-3.8/cmake下的CMake文件。它们有两个:

  • LLVMConfig.cmake

  • LLVMExports-relwithdebinfo.cmake

需要将其复制到上述位置(不要忘记备份现有文件)。
此操作需要sudo权限。

我还尝试创建了一个.diff(统一的)并在此处上传,但由于大小限制无法放置,因此我将文件放置在[GitHub]: CristiFati/llvm_fixes - (3.8-ubtu-cmake)(请查看包含几乎与此帖子相同信息的NOTES.md)。

注意:我将所有新变量命名为_CFATI_*,以便更容易地发现更改(例如,如果删除了原始文件)。随意重命名它们。


0
在我的情况下,安装“llvm-dev”软件包解决了问题。
这将安装3.8版本(在我的情况下),但路径和位置与“llvm-3.8-dev”软件包不同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接