Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在宏中使用带有CMake的find_包的Qt4时出现问题_Cmake_Qt4_Cmake Language - Fatal编程技术网

在宏中使用带有CMake的find_包的Qt4时出现问题

在宏中使用带有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() 现在,当我尝试以以下方式调用宏时,我得到

我在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_包,它会工作

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.