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

时间:2018-07-05 16:36:01

标签: c++ qt c++11 cmake

我们正在将项目从Ubuntu 14.04迁移到Ubuntu 16.04,并且在与Qt一起使用名为PCL的库时遇到了问题。症状是,在尝试构建项目时,QtQuick和QtQml具有多个未引用的功能。现在,问题已解决,但突出显示了我们不了解的Cmake行为。

PCL 1.8.1使用系统中的Qt 5.5.1(/ usr / lib / x86_64-linux-gnu / cmake)–这是通过apt-get软件包安装的默认Qt版本。 现在轮到我们的项目使用Qt 5.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_package指令返回的路径,并观察到PCL使用的库(Qt5Widgets,Qt5Core,Qt5Gui和Qt5OpenGL)都引用了旧的Qt 5.5.1版本。而且仅由我们的可执行文件使用的库链接到正确的新Qt 5.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_package为何在第一处找不到正确的Qt版本?

如何强制find_package在给定路径中查找软件包?也就是说,我们可以强制find_package覆盖它先前知道的路径吗?

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

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

# 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)

0 个答案:

没有答案