C++ 使用2个库(Qt和PCL)时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创建了不匹配。我们不理解这种不匹配 我们通常按以下顺序调用库: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创建了不匹配
# 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再次搜索
-清除相应的缓存条目(条目)。这是唯一的办法。