【问题标题】:Problem using Qt4 with find_package of CMake, inside a macro在宏内使用 Qt4 和 CMake 的 find_package 时出现问题
【发布时间】:2020-03-11 05:00:31
【问题描述】:

我在 CMake(3.10 版)中定义了以下宏:

macro(configureQt4 requiredVersion selectedPackages)
    message(STATUS "selectedPackages: ${selectedPackages}")
    find_package(Qt4 ${requiredVersion} COMPONENTS ${selectedPackages} REQUIRED ) 
endmacro()

现在,当我尝试通过以下方式调用宏时,出现错误:

set(SelectedQt4Packages "QtCore QtNetwork")
configureQt4( 4.8 ${SelectedQt4Packages})

报错是:

CMake Error at /usr/share/cmake-3.10/Modules/FindPackageHandleStandardArgs.cmake:137 (message):
  Could NOT find Qt4 (missing: QT_QTCORE QTNETWORK_INCLUDE_DIR QT_QTCORE
  QTNETWORK_LIBRARY) (found suitable version "4.8.7", minimum required is
  "4.8")

如果我在宏内部按以下方式调用find_package(),它可以工作!

find_package(Qt4 ${requiredVersion} COMPONENTS QtCore QtNetwork REQUIRED )

但我需要通过设置变量来使用它,如前所述。我该如何解决这个问题?

【问题讨论】:

    标签: cmake qt4 cmake-language


    【解决方案1】:

    如果要在 CMake 中设置列​​表变量,可以通过排除引号来实现:

    set(SelectedQt4Packages QtCore QtNetwork)
    

    使用像"QtCore QtNetwork" 这样的引号只会在两个组件名称之间创建一个带有空格的字符串,这可能不是您想要的。

    现在,您可以将SelectedQt4Packages 列表变量传递给您的宏,但请务必用引号将其括起来(如answer 中所建议的那样):

    set(SelectedQt4Packages QtCore QtNetwork)
    configureQt4( 4.8 "${SelectedQt4Packages}")
    

    【讨论】:

    • 是的,这个答案要好得多。 +1
    【解决方案2】:

    这是因为 CMake 需要一个 list 组件。也就是说,每个项目由; 分隔的字符串。如果您改为使用set(SelectedQt4Packages "QtCore;QtNetwork") 并将调用更改为configureQt4( 4.8 "${SelectedQt4Packages}")(注意双引号),它应该会按预期工作。

    编辑:更简洁的解决方案是将参数简单地转换为宏内的列表:

    # Now we can set selectedPackages to either "QtCore QtNetwork" or "QtCore;QtNetwork", both will work.
    macro(configureQt4 requiredVersion selectedPackages)
        message(STATUS "selectedPackages: ${selectedPackages}")
        string(REPLACE " " ";" _selectedQtPackages ${selectedPackages})
        find_package(Qt4 ${requiredVersion} COMPONENTS ${_selectedQtPackages} REQUIRED )
    endmacro()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多