Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.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
C++ 使用2个库(Qt和PCL)时cmake不匹配_C++_Qt_C++11_Cmake - Fatal编程技术网

C++ 使用2个库(Qt和PCL)时cmake不匹配

C++ 使用2个库(Qt和PCL)时cmake不匹配,c++,qt,c++11,cmake,C++,Qt,C++11,Cmake,我们正在将一个项目从Ubuntu14.04迁移到Ubuntu16.04,在使用名为PCL的库和Qt时遇到了一个问题。症状是QtQuick和QtQml在尝试构建项目时有几个未引用的函数。这个问题现在已经解决了,但它突出了我们不了解的Cmake中的一个行为 PCL 1.8.1使用系统中的Qt 5.5.1(/usr/lib/x86_64-linux-gnu/cmake)——这是通过apt get软件包安装的默认Qt版本。 现在我们的项目使用Qt5.9.1(作为依赖项),而2个Qt版本为Qt创建了不匹配

我们正在将一个项目从Ubuntu14.04迁移到Ubuntu16.04,在使用名为PCL的库和Qt时遇到了一个问题。症状是QtQuick和QtQml在尝试构建项目时有几个未引用的函数。这个问题现在已经解决了,但它突出了我们不了解的Cmake中的一个行为

PCL 1.8.1使用系统中的Qt 5.5.1(/usr/lib/x86_64-linux-gnu/cmake)——这是通过apt get软件包安装的默认Qt版本。 现在我们的项目使用Qt5.9.1(作为依赖项),而2个Qt版本为Qt创建了不匹配。我们不理解这种不匹配

我们通常按以下顺序调用库:

# PCL
set(CMAKE_PREFIX_PATH ../Dependencies/pcl/v1.8.1)
find_package(PCL 1.7 REQUIRED COMPONENTS common io filters)

# Qt
set(CMAKE_AUTOMOC ON) # Instruct CMake to run moc automatically when needed.
set(CMAKE_PREFIX_PATH ../Dependencies/Qt/v5.9.1/5.9.1/gcc_64)
find_package(Qt5Widgets        REQUIRED)
find_package(Qt5Core           REQUIRED)
find_package(Qt5Gui            REQUIRED)
find_package(Qt5OpenGL         REQUIRED)
find_package(Qt5Quick          REQUIRED)
find_package(Qt5Qml            REQUIRED)
find_package(Qt5QuickControls2 REQUIRED)
然后,我们打印了find_包指令返回的路径,并观察到PCL使用的库(Qt5Widgets、Qt5Core、Qt5Gui和Qt5OpenGL)都引用了旧的Qt 5.5.1版本。我们的可执行文件只使用的库链接到正确的新Qt5.9.1版本。此版本不匹配导致Cmake中出现警告,生成失败并出现大量链接错误

因此,我们更改了呼叫顺序并交换了Qt和PCL:

# Qt
set(CMAKE_AUTOMOC ON) # Instruct CMake to run moc automatically when needed.
set(CMAKE_PREFIX_PATH ../Dependencies/Qt/v5.9.1/5.9.1/gcc_64)
find_package(Qt5Widgets        REQUIRED)
find_package(Qt5Core           REQUIRED)
find_package(Qt5Gui            REQUIRED)
find_package(Qt5OpenGL         REQUIRED)
find_package(Qt5Quick          REQUIRED)
find_package(Qt5Qml            REQUIRED)
find_package(Qt5QuickControls2 REQUIRED)

# PCL
set(CMAKE_PREFIX_PATH ../Dependencies/pcl/v1.8.1)
find_package(PCL 1.7 REQUIRED COMPONENTS common io filters)
使用此配置,我们不再有错误。因此我们的问题是:为什么find_包在第一位没有找到正确的Qt版本

如何强制find_package在给定路径中查找包?i、 e.我们可以强制find_包覆盖它以前知道的路径吗

------------------------编辑------------------------

多亏@Tsyvarev的建议,我们才得以解决问题。在第一个示例中,我们必须添加
unset(Qt5缓存)
,如下所示:

# PCL
set(CMAKE_PREFIX_PATH ../Dependencies/pcl/v1.8.1)
find_package(PCL 1.7 REQUIRED COMPONENTS common io filters)

# Qt

unset (Qt5 CACHE)

set(CMAKE_AUTOMOC ON) # Instruct CMake to run moc automatically when needed.
set(CMAKE_PREFIX_PATH ../Dependencies/Qt/v5.9.1/5.9.1/gcc_64)
find_package(Qt5Widgets        REQUIRED)
find_package(Qt5Core           REQUIRED)
find_package(Qt5Gui            REQUIRED)
find_package(Qt5OpenGL         REQUIRED)
find_package(Qt5Quick          REQUIRED)
find_package(Qt5Qml            REQUIRED)
find_package(Qt5QuickControls2 REQUIRED)

为什么find_软件包首先没有找到正确的Qt版本?
-因为它不知道新Qt安装的路径。当您调用
find_package(PCL)
时,它只有一个关于PCL位置的提示(
set(CMAKE_PREFIX_PATH../Dependencies/PCL/v1.8.1)
)。因此,当它调用
find_package(Qt5)
时,除了系统安装的QT之外,它找不到任何东西。请注意,
CMAKE_PREFIX_PATH
变量可能包含路径列表,因此您可以将其设置为同时包含两条路径:PCL和QT5 one。第二种情况“有效”,因为
find_package
的结果被缓存(在某种程度上)。第一个调用(在您的代码中)设置到新QT库的路径,因此第二个调用(在
find_-package(PCL)
)中)只使用这些库,它不会再次尝试查找库。@Tsyvarev:但在第一个示例中调用find_-package()之前,我们确实调用了$set(CMAKE_-PREFIX_-PATH../dependenciences/QT/v5.9.1/5.9.1/gcc_64)$!因此Qt应该位于正确的位置,否?是否可以强制find_package再次搜索(而不是查找缓存路径)?
是否可以强制find_package再次搜索
-清除相应的缓存条目(条目)。这是唯一的办法。