在宏中将 Qt4 与 CMake 的 find_package 结合使用时出现问题
Problem using Qt4 with find_package of CMake, inside a macro
我在 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 需要一个 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()
如果你想在CMake中设置一个列表变量,你可以通过排除引号来实现:
set(SelectedQt4Packages QtCore QtNetwork)
使用这样的引号 "QtCore QtNetwork"
只是在两个组件名称之间创建一个带有 space 的字符串,这可能不是您想要的。
现在,您可以将 SelectedQt4Packages
列表变量传递给您的宏,但一定要用引号将其括起来(如 answer 中所建议):
set(SelectedQt4Packages QtCore QtNetwork)
configureQt4( 4.8 "${SelectedQt4Packages}")
我在 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 需要一个 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()
如果你想在CMake中设置一个列表变量,你可以通过排除引号来实现:
set(SelectedQt4Packages QtCore QtNetwork)
使用这样的引号 "QtCore QtNetwork"
只是在两个组件名称之间创建一个带有 space 的字符串,这可能不是您想要的。
现在,您可以将 SelectedQt4Packages
列表变量传递给您的宏,但一定要用引号将其括起来(如 answer 中所建议):
set(SelectedQt4Packages QtCore QtNetwork)
configureQt4( 4.8 "${SelectedQt4Packages}")