在宏内使用 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 时出现问题的主要内容,如果未能解决你的问题,请参考以下文章