【问题标题】:Error when using CMake with LLVM将 CMake 与 LLVM 一起使用时出错
【发布时间】:2016-11-05 09:47:57
【问题描述】:

所以我正在尝试使用 LLVM 构建一个玩具编译器,并且我想使用 CMake 作为我的构建系统。我尝试使用 LLVM 网站上的sample 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() 的文件大多是不可重定位的。您安装了哪些exact llvm 软件包?哪个包包含/usr/share/llvm-3.8/cmake/LLVMConfig.cmake/usr/share/llvm/cmake/LLVMExports.cmake 文件?
  • 我通过 Ubuntu 的包管理器安装了 llvm-3.8,这就是为什么我觉得它只是用错误的链接打包
  • 您是否检查过.cmake 文件是否包含相同的软件包?
  • 打包在 /usr/share/llvm-3.8/ 中的 .cmake 文件似乎引用了 /usr/share/llvm 中的文件

标签: c++ ubuntu cmake llvm


【解决方案1】:

AFAIK,这是 Ubuntu 打包中的一个众所周知的错误。 Ubuntu 16.04 上的 llvm-3.8-dev 中仍然存在原始问题,请参阅 herehere

尝试通过手动设置导入前缀来修复 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:

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

为了节省时间,请自己从源代码构建 LLVM 并设置 LLVM_DIR 环境变量。看到这个tutorial

【讨论】:

    【解决方案2】:

    最简单的选择是安装没有该问题的 LLVM 版本:执行此操作后错误消失了:

    apt-get remove llvm
    apt-get autoremove
    apt-get install llvm-3.9
    

    (在 Ubuntu 16.04 上测试。)

    【讨论】:

      【解决方案3】:

      您需要修复 LLVMExports-relwithdebinfo.cmake 而不是 LLVMExports.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  
      

      【讨论】:

        【解决方案4】:

        在我的例子中,安装包 'llvm-dev' 解决了这个问题。

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

        【讨论】:

          【解决方案5】:

          我今天(2019/01/03)在处理 [SO]: Linking LLVM causes gcov to fail - (@CristiFati's answer) 时遇到了这个问题。

          环境:

          • Ubtu 16 x64
          • cmake 3.5.1
          • gcc 5.4.0
          • llvm 3.8.0 (llvm-3.8-dev)

          有 2 种错误(在 .cmake 文件中):

          • 对不正确路径的引用(缺少版本 (3.8)):
            • 到其他 .cmake 文件(通过包含)
            • 到库(.a.so)和可执行文件
          • 对不存在的库和可执行文件的引用

          没有过多阅读根本原因,我修复了 /usr/share/llvm-3.8/cmake 下的 cmake 文件。其中有 2 个:

          • LLVMConfig.cmake
          • LLVMExports-relwithdebinfo.cmake

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

          我也尝试创建一个diff(统一)并在此处上传,但由于大小限制不适合,所以我将文件放在[GitHub]: CristiFati/llvm_fixes - (3.8-ubtu-cmake)(检查 NOTES.md,其中包含与本文几乎相同的信息)。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-02-09
            • 2015-04-08
            • 2019-01-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多