在宏内使用 Qt4 和 CMake 的 find_package 时出现问题

Posted

技术标签:

【中文标题】在宏内使用 Qt4 和 CMake 的 find_package 时出现问题【英文标题】:Problem using Qt4 with find_package of CMake, inside a macro 【发布时间】: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 )

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

【问题讨论】:

【参考方案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()

【讨论】:

以上是关于在宏内使用 Qt4 和 CMake 的 find_package 时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

#if #endif 在宏内[重复]

Qt4升级到Qt5需要干的那些事(CMake)

CMake不知道Qt4 qmake在哪里

使用 cmake 和 Qt4 制作期间的 RCC 解析错误

如何在 Ubuntu 中使用 cmake 设置 qt4?

cmake 不使用 QT4_automoc 生成 Qt moc 文件