【问题标题】:Cannot make Conan + CMake + QT work together. No valid Qt version found for target无法让 Conan + CMake + QT 协同工作。找不到目标的有效 Qt 版本
【发布时间】:2022-11-27 14:45:01
【问题描述】:

当我设置set(CMAKE_AUTOMOC ON) cmake 说

src/ProjQt/CMakeLists.txt 中的 CMake 警告(开发):AUTOGEN:否 找到目标 ProjQt 的有效 Qt 版本。禁用 AUTOMOC。 考虑添加:

find_package(Qt<QTVERSION> COMPONENTS Core)

到您的 CMakeLists.txt 文件。

如果我在set(CMAKE_AUTOMOC ON)之前添加find_package(Qt5 COMPONENTS Core)

src/ProjQt/CMakeLists.txt:5 (find_package) 处的 CMake 警告:
通过在 CMAKE_MODULE_PATH 中不提供“FindQt5.cmake”,该项目具有
让CMake找一个“Qt5”提供的包配置文件,
但是 CMake 没有找到。
...

我认为 conan 提供了一个自定义的 find_package ,它的行为首先与 conan 相关,如果失败则默认,但它看起来不像 vcpkg 那样提供它

所有这些动作都是在include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)之后完成的

【问题讨论】:

    标签: qt cmake conan


    【解决方案1】:

    我再次遇到同样的问题,这就是我设法解决它的方法:

    1. 设置适当的柯南生成器以生成所需的配置 cmake 文件
      • 我使用 generators = "cmake_find_package_multi" 中提到的this issue(又是我自己的问题)
      1. Conan 现在生成了很多 &lt;PKG&gt;Config/Target.cmake 文件(在我的例子中),我们需要指向 cmake 以在 conan docs 和此处 in cmake docs 中指定的文件夹中查找配置
      2. 此时 AUTOMOCAUTOUICAUTORCC 应该可以使用以下配置:
      find_package(Qt5 CONFIG REQUIRED)
      set(CMAKE_AUTOMOC ON)
      set(CMAKE_AUTOUIC ON)
      set(CMAKE_AUTORCC ON)
      

      我后来遇到了两种不同的问题


      AutoMoc error
      -------------
      "SRC:/src/<thisfilename>.cpp"
      contains a "Q_OBJECT" macro, but does not include "<thisfilename>.moc"!
      Consider to
        - add #include "<thisfilename>.moc"
        - enable SKIP_AUTOMOC for this file
      

      这可以通过将 Q_OBJECT 类移动到标题中或在类下面添加 #include &lt;thisfilename.moc&gt; 来解决,cmake 会自动填充此文件的直接路径而无需路径嵌套。例如,如果我有一个名为“test.cpp”的文件,我必须这样做:

      #include <QObject>
      
      class TestObject : public QObject
      {
          Q_OBJECT
      };
      
      #include <test.moc>
      

      未解决的对 metaObjectqt_metacastqt_metacall 等的引用的链接器错误...
      在那种情况下,这意味着 moc 生成的源代码没有被添加到编译中。
      它可以通过在 add_executable 调用中添加头文件和 .cpp 文件来解决:

      file(GLOB SOURCES
          include/*.h
          src/*.cpp
      )
      add_executable(${PROJECT_NAME} ${SOURCES})
      

      或者在 Q_OBJECT 的 cpp 实现文件中包含一个文件 #include &lt;moc_thisfilename.cpp&gt;,如下所示:
      test.hpp

      #include <QObject>
      
      class TestObject : public QObject
      {
          Q_OBJECT
      };
      

      test.cpp

      #include <test.hpp>
      #include <moc_test.cpp>
      

      我还没有找到一种方法来忘记这个 moc 生成魔法,并在包含包含 Q_OBJECT 相关内容的标头时以智能方式使 CMake 自动包含所有内容

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-12
      • 2013-09-28
      • 2018-04-10
      • 2013-09-14
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      相关资源
      最近更新 更多