在宏中使用带有CMake的find_包的Qt4时出现问题
我在CMake版本3.10中定义了以下宏:在宏中使用带有CMake的find_包的Qt4时出现问题,cmake,qt4,cmake-language,Cmake,Qt4,Cmake Language,我在CMake版本3.10中定义了以下宏: macro(configureQt4 requiredVersion selectedPackages) message(STATUS "selectedPackages: ${selectedPackages}") find_package(Qt4 ${requiredVersion} COMPONENTS ${selectedPackages} REQUIRED ) endmacro() 现在,当我尝试以以下方式调用宏时,我得到
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_包,它会工作
find_package(Qt4 ${requiredVersion} COMPONENTS QtCore QtNetwork REQUIRED )
但是我需要通过设置一个变量来使用它,正如前面所讨论的。如何解决此问题?这是因为CMake需要一个组件列表。也就是说,一个字符串,其中每个项由一个;分隔;。如果您改为设置SelectedQT4包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需要一个组件列表。也就是说,一个字符串,其中每个项由一个;分隔;。如果您改为设置SelectedQT4包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的引号,只需在两个组件名称之间创建一个带有空格的字符串,这可能不是您想要的
现在,您可以将SelectedQt4Packages列表变量传递给宏,但请确保使用引号将其括起来,如下所示:
如果要在CMake中设置列表变量,可以通过排除引号来实现:
set(SelectedQt4Packages QtCore QtNetwork)
使用类似于QtCore QtNetwork的引号,只需在两个组件名称之间创建一个带有空格的字符串,这可能不是您想要的
现在,您可以将SelectedQt4Packages列表变量传递给宏,但请确保使用引号将其括起来,如下所示:
是的,这个答案好多了+1是的,这个答案好多了+1.