使用CMake为Android配置Qt5 5.7应用程序

18

我已经成功地使用 CMake这个 CMake 实用程序配置和构建了一些面向Android的Qt5应用程序。

一切都很顺利,直到我从Qt5.6转换到Qt5.7。当我尝试配置时,我遇到了一个CMake错误,这并没有帮助我太多:

-- Configuring done
CMake Error in CMakeLists.txt:
  No known features for CXX compiler

  "GNU"

  version 4.9.

-- Generating done
-- Build files have been written to: /path/to/build-dir

我像这样运行CMake:

ANDROID_SDK=/path/to/android-sdk-linux \
ANDROID_NDK=/path/to/android-ndk-r12 \
QT_ANDROID_ROOT=/path/to/Qt-5.7.0-android \
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk \
ANT=/usr/bin/ant \
cmake /path/to/CMakeLists.txt \
      -DCMAKE_PREFIX_PATH=$QT_ANDROID_ROOT \
      -DCMAKE_TOOLCHAIN_FILE=/path/to/android.toolchain.cmake

我可以使用一个最简C++程序重现这个行为:

#include <iostream>
int main() { std::cout << "hi" << std::endl; }

并且有一个最简的CMakeLists.txt

cmake_minimum_required(VERSION 3.1)
find_package(Qt5Core)
add_executable(foo main.cpp)
target_link_libraries(foo Qt5::Core)

导致这个错误的代码行是target_link_libraries(foo Qt5 :: Core) - 如果没有它,程序可以正常配置和编译。

以下是我尝试过的一些方法:

  • 通过将ANDROID_NATIVE_API_LEVEL设置为android-8、9、16、18和其他一些在其他地方有效的值(构建Qt5.7自动使用android-16),使用不同的NDK API级别

  • 使用不同的NDK版本(10e对我来说与Qt5.6一起使用效果很好,当前版本是12)

  • 尝试预构建的Qt5.7而不是从GitHub自己制作

到目前为止,我只是组合了不同版本的SDK / NDK / Qt / NDK_API_LEVEL,但老实说我不知道自己在做什么..

您可以通过以下方式帮助我:

  • 告诉我我做错了什么(最好!)
  • 详细解释CMake错误以给我提示
  • 提供一个可工作的CMake / Android / Qt5.7示例,我可以使用它来查找问题

同样的问题,整个下午都在搜索。 Qt5.6.1可以正常工作,但是使用相同的工具链和Qt5.7.0时会给我带来与你一样的错误。还尝试了cmake 3.5.2,但没有更多的运气。 - Falco
@frans:如果我是你,我会放弃qt-android-cmake,从我的CMake脚本手动编写.pro文件。这就是我所做的,而且手动编写.pro文件非常明显,因为语法非常简单...虽然需要一些工作,但从长远来看可能是更好的解决方案... - jpo38
Qt5.7会执行set(CMAKE_CXX_STANDARD 11)命令,该命令会让cmake添加一个-std=gnu++11选项,因此你的编译器可能不喜欢它。如果可以的话,尝试将gcc版本升级到5.3或类似版本可能会有所帮助。 - cmourglia
另外,我不知道你是否在使用QtCreator,但我记得在让最新版本编译我的代码后出现了这种错误,我不得不获取一个全新的干净目录来重新编译它(从命令行开始,我想我不会再运行QtCreator了:D),这也可能与此有关。 - cmourglia
5个回答

13
作为一种解决方法(请参考此处),您可以注释掉这行代码。
set_property(TARGET Qt5::Core PROPERTY INTERFACE_COMPILE_FEATURES cxx_decltype)

在 lib/cmake/Qt5Core/Qt5CoreConfigExtras.cmake 文件中


3

对我来说,诀窍是清理所有配置和临时构建文件,并强制重新配置项目:

  • 关闭Qt Creator
  • 手动删除
    • Qt构建文件夹
    • 所有.pro.user.cmake.user文件
    • 所有CMake构建文件夹
  • 重新打开项目

1

我认为这条信息并不是很有帮助,所以我的回答只是猜测。看起来cmake未能正确检测到您的工具链(GCC),这与cmake内部有关,而不一定是您的脚本问题。

我找到了一个相关的问题:在使用MSVC++ 2013编译时出现“CXX编译器没有已知特性”

此外,如果您在谷歌上搜索“'No known features for CXX compiler' cmake”,则会在搜索结果中看到一些cmake的错误报告。

您可以尝试更新cmake版本(如果有可用的版本)。如果问题仍然存在,建议使用cmake-users邮件列表或IRC频道解决问题。


0

您正在使用的CMake实用程序已经过时,无法适应较新版本的Qt和Android-NDK。 我曾经遇到了与您相同的问题,并且无法使其正常工作。但是,通过替换由Android NDK提供的CMake工具链文件,我可以使一切都按照预期工作并编译。


-1

你需要在CMakeFile.txt中设置"project(MyProject)"

我遇到了同样的错误,但是"project(Myproject)"在if语句中。将其移出修复了问题:

CMakeList.txt 错误: cmake_minimum_required (VERSION 3.10) if(${SOMETHING}) project(MyProject) : endif

CMakeList.txt 成功: cmake_minimum_required (VERSION 3.10) project(MyProject) if(${SOMETHING}) : endif


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接